2009-08-21 5 views
3

Es gibt bereits eine ähnliche question, aber es schien nicht nach der Situation zu fragen, die die Frage impliziert.Wie verwende ich Reflection, um eine Eigenschaft mit einem Listentyp zu setzen <CustomClass>

Der Benutzer fragte nach benutzerdefinierten Klassen in einer Liste, aber sein Listenobjekt ist vom Typ string.

ich eine Klasse Foo haben, die eine Liste von Bars hat:

public class Foo : FooBase 
    { 
     public List<Bar> bars {get; set;} 
     public Foo() {} 
    } 

    public class Bar 
    { 
     public byte Id { get; set; } 
     public byte Status { get; set; } 
     public byte Type { get; set; } 
     public Bar(){} 
    } 

I Foo mit Reflexion über Activator.CreateInstance instanziiert(). Jetzt muss ich die Liste der Bars mit Bar-Objekten füllen.

Foo erhalten

Assembly.GetAssembly(FooBase).GetTypes().Where(type => type.IsSubclassOf(FooBase)); 

Bar verwendet, ist eine öffentliche Klasse in derselben Versammlung. Ich muss irgendwie auf diesen Typ eingehen. Ich kann nicht sehen, was der Typ der Liste in Foo ist. Ich weiß, dass es eine Liste ist. Ich sehe die Listeneigenschaft als Liste "1".

Ich müsste sehen, welche Art von Objekt die Liste hält und entsprechend behandeln.

+0

Sorry, Ich habe den Kommentar, den Sie meine frühere Antwort hinzugefügt; Dieser umhüllte Umschlag (oben auf dem Bildschirm) macht es nicht immer einfach, Dinge zu finden, wenn Sie in kurzer Zeit viele Kommentare hinzugefügt haben. –

Antwort

3

Der Text

List`1 

ist die Art und Weise, die Generika unter der Motorhaube geschrieben werden - "Liste mit 1 generischem Typ arg, aka List<>" bedeutet. Wenn Sie eine PropertyInfo haben, sollten Sie eingestellt sein; Dies wird das geschlossene generische List<Bar> sein. Möchten Sie die Bar gegebenen nur finden? Wenn ja, wird dies in verschiedenen Fragen diskutiert, einschließlich this one; den Schlüssel Bit zu duplizieren (I-Code lieber gegen IList<T>, da es ein paar Ränder Fälle wie von List<T> vererben Griffen):

static Type GetListType(Type type) { 
    foreach (Type intType in type.GetInterfaces()) { 
     if (intType.IsGenericType 
      && intType.GetGenericTypeDefinition() == typeof(IList<>)) { 
      return intType.GetGenericArguments()[0]; 
     } 
    } 
    return null; 
} 
2
var prop = footype.GetProperty("bars"); 
// In case you want to retrieve the time of item in the list (but actually you don't need it...) 
//var typeArguments = prop.PropertyType.GetGenericArguments(); 
//var listItemType = typeArguments[0]; 
var lst = Activator.CreateInstance(prop.PropertyType); 
prop.SetValue(foo, lst, null); 
Verwandte Themen