Gå til innhold

C#: Array av typer, begrenset til et interface


Anbefalte innlegg

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

Lenke til kommentar
Videoannonse
Annonse

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
Lenke til kommentar

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.

Lenke til kommentar
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.

Lenke til kommentar

: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.

Lenke til kommentar

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å
×
×
  • Opprett ny...