2016-07-27 15 views
0

Ich habe das folgende Problem: Ich möchte ein Listenelement zu einer Sammlung zu einem Feld einer Klasse hinzufügen.ListItem zu einem Feld vom Typ Liste hinzufügen <MyClass> mit Reflection

Um klar zu sein: Ich habe eine Klasse:

class MyClass { 
    List<MyStruct> myList1; 
    List<MyStruct> myList2; 
} 

struct MyStruct { 
    string foo { get; set; } 
    string bar { get; set; } 
} 

Was ich will, ist, indem sie das Feld durch eine MyStruct zur Liste mylist1 hinzuzufügen:

MyClass blub = new MyClass(); 
(blub.GetType().GetField("myList1") as List<MyStruct>).Add(new Mystruct { 
     foo = "foo"; 
     bar = "bar"; 
    }); 

Gibt es eine Möglichkeit, um dies in irgendeiner Weise zu erreichen? Das Hauptproblem ist, dass ich mein Feld durch eine Zeichenfolge identifizieren muss.

Antwort

2

Mit Reflection müssen Sie die BindingFlags angeben, um private Felder abzurufen. Wenn Sie es erhalten, müssen Sie FieldInfo.SetValue und FieldInfo.GetValue verwenden. Wie folgt aus:

MyClass blub = new MyClass(); 

var field = blub.GetType().GetField("myList1", BindingFlags.NonPublic | BindingFlags.Instance); 
List<MyStruct> value = field.GetValue(blub) as List<MyStruct>; 

if (value == null) 
    value = new List<MyStruct>(); 

value.Add(new MyStruct { foo = "foo", bar = "bar" }); 

field.SetValue(blub, value); 

Beachten Sie, dass die Eigenschaften Ihrer Struktur ändern müssen öffentlich sein:

struct MyStruct 
{ 
    public string foo { get; set; } 
    public string bar { get; set; } 
} 
+0

Der Schlüssel einen get-Wert zu tun war, um die Liste zu bekommen. und dann den Wert erneut auf das Feld setzen. Danke! –