Greifen Sie mit Reflection auf Felder einer Struktur in einem Objekt zu
Ich versuche, Reflection zu verwenden (letztendlich bei unbekannter Kompilierungszeit)object
die einschließenstruct
. Ich bin so weit gekommen wieTypedReference.MakeTypedReference
aber ich habe eine Wand getroffen.
Hier ist meine Klasse und Struktur
public class MyObject
{
public int Id;
public Money Amount;
}
public struct Money
{
public int Vaule;
public string Code;
}
Und hier ist, wie ich versuche, "Code" von "Betrag" in MyObject mit Reflektion einzustellen. Wie oben erwähnt, suche ich nach einer Lösung, die diese Typen zum Zeitpunkt der Kompilierung nicht kennt (das wäre zu einfach!)
Hier ist der Code, den ich bisher habe (ich habe [0], [1] verwendet, um den Code einfacher zu machen)
var obj = new MyObject() { Id = 1 };
obj.Amount.Vaule = 10;
obj.Amount.Code = "ABC";
FieldInfo[] objFields = obj.GetType().GetFields();
FieldInfo[] moneyFields = objFields[1].GetValue(obj).GetType().GetFields();
List<FieldInfo> fields = new List<FieldInfo>() { objFields[1] };
fields.AddRange( moneyFields );
TypedReference typeRef = TypedReference.MakeTypedReference(
objFields[1].GetValue( obj ), fields.ToArray() );
moneyFields[1].SetValueDirect( typeRef, "XXX" );
Die TypedReference.MakeTypedReference sprengt mit; "FieldInfo stimmt nicht mit dem Zieltyp überein." Ebenso, wenn ich gerade übergebeobjFields[1]
. Und wenn nur passierenmoneyFields
Ich erhalte die Meldung "TypedReferences können nicht als Grundelemente neu definiert werden."
Warum? Angenommen, ich erstelle zufällige Test-Fixtures und möchte Klassenfelder mit zufälligen Daten füllen :)