Gå til innhold

C#: Array av typer, begrenset til et interface


Anbefalte innlegg

Skrevet

Er det mulig å lage et array av typer, som er begrenset til typer som implementerer et interface eller arver fra en spesiell klasse? Altså ikke objekter av disse typene, men typene selv. Slik at jeg for eksempel kan ta

 InterfaceClass c = new typeof(list[0]);

 

eller noe sånt. om det ga mening i det hele tatt :p

Videoannonse
Annonse
Skrevet

Ja, det kan du... men husker ikke helt syntaksen...

public class InterfaceClassList<T : IInterfaceClass> : List<T>
{
}

 

Noe slikt kanskje?

 

Du finner sikkert ut av det hvis du bare leser om generics på MSDN

Skrevet (endret)

Litt usikker på hva du mener, men er det noe av dette?

public interface IMyInterface
{
}

public class A : IMyInterface
{
}

public class B : IMyInterface
{
}

List<IMyInterface> array = new List<IMyInterface>();
array.Add(new A());
array.Add(new B());

Endret av The Jackal
Skrevet

nesten. noe som dette:

public interface IMyInterface
{
}

public class A : IMyInterface
{
}

public class B : IMyInterface
{
}

List<IMyInterface> array = new List<IMyInterface>();
array.Add(typeof(A));
array.Add(typeof(B));

Skrevet

Vel...simpleste case vil være å bruke:

 

List<Type> array = new List<Type>();

A a = new A();

B b = new B();

array.Add(a.GetType());

array.Add(b.GetType());

 

Litt usikker på om du faktisk kan si om typen som lagres der f.eks skal implementere et interface siden du strengt tatt ikke lagrer den klassen der, men et object av typen Type. Du må eventuelt implementere din egen Type på en eller annen måte, men etter hva jeg kjapt så på MSDN, så var ikke det akkurat rett fram.

Skrevet

nei nemlig. målet var om det var mulig å ha en liste med klasser som en bruker kunne opprette liksom. men men. finner sikkert en annen løsning :p

Skrevet
Du må enten bruke et felles interface eller superklasse som alle arver.

Å gjøre det på noen annen måte er fullstendig ulogisk.

 

Det vil jo uansett ikke løse problemstillingen hans. Hvis jeg nå forstår det korrekt vel og merke, vil han bare ha en liste med forskjellige typer som man kan instansiere. Hvis han skal gjøre det må han vel muligens lage sin egen klasse som arver fra Type, og override GetType eller no slikt på klassene han bruker. Vet strengt tatt ikke om det går.

Skrevet

:p

 

Eller overloade Add på List<T> og legge til en sjekk der?

 

Vel, for denne jobben har jeg som regel bare brukt en List<Type> og kontrollert når jeg har lagt til typene at de for eksempel arver fra et visst interface, som kan sjekkes ganske enkelt med Type klassen.

Enten kan du bruker interface, eller en attributt, helst begge deler.

 

Deretter brukes bare den velkjente Activator for å lage en ny instans.

 

Typisk sted en bruker dette på er når en laster en Dll dynamisk for å utvide programmet.

 

Jeg bruker dette i flere programmer for å kunne legge til nye funksjoner, og det jeg gjør da, er at alle funksjoner som skal brukes av mor-programmet må få en spesiell attributt som også gir annen data som for eksempel grafikk som assosieres med klassen og eventuell beskrivelse. Deretter sjekkes det at klassene bruker et spesifikt interface fra en felles dll fil.

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...