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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage