Dostęp do pól Struct w obiekcie z odbiciem
Próbuję użyć refleksji (ostatecznie w nieznanym czasie kompilacji)object
który zawierastruct
. Mam tak daleko jakTypedReference.MakeTypedReference
ale uderzyłem w ścianę.
Oto moja klasa i Struct
public class MyObject
{
public int Id;
public Money Amount;
}
public struct Money
{
public int Vaule;
public string Code;
}
A oto jak próbuję ustawić „Kod” w „Kwocie” w MyObject za pomocą odbicia. Jak wspomniałem powyżej, szukam rozwiązania, które nie wie o tych typach w czasie kompilacji (byłoby to zbyt proste!)
Oto kod, który mam do tej pory (użyłem [0], [1] do uproszczenia kodu)
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" );
TypedReference.MakeTypedReference wysadza w powietrze; „FieldInfo nie pasuje do typu celu”. Podobnie, jeśli tylko przejdęobjFields[1]
. A jeśli tylko przejdzieszmoneyFields
Dostaję „TypedReferences nie można na nowo zdefiniować jako prymitywów”.
Czemu? Załóżmy, że tworzę losowe urządzenia testowe i chcę wypełnić pola klas losowymi danymi :)