Próbuję użyć odbicia (ostatecznie nieznanego w czasie kompilacji) object
, które obejmują struct
. Dotarłem aż do TypedReference.MakeTypedReference
, ale uderzyłem w ścianę.Pola dostępu obiektu Struct w obiekcie z odbiciem
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” z „ilość” w MyObject użyciu odbicia. Jak wspomniałem powyżej, szukam rozwiązania, które nie wie o tych typach w czasie kompilacji (byłoby to zbyt łatwe!)
Oto kod, który mam do tej pory (użyłem [0], [1], aby kod prostsze)
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 wdmuchuje się z; "FieldInfo nie pasuje do typu docelowego." Podobnie jeśli przekażę tylko objFields[1]
. I jeśli przejdę tylko moneyFields
otrzymam "TypedReferences nie może być przedefiniowany jako prymitywy."
Dlaczego? Powiedzmy Tworzę Losowe urządzeń testowych i chcą wypełnić pola klasy z danych losowych :)
Czy mówisz, że podczas kompilacji nie wiesz, czy używasz MyObject lub Money, więc musi wykryć, który obiekt jest używany i odczytać/zapisać właściwość odpowiednio? – series0ne
Co powiecie na temat korzystania z AutoFixture i wydostawania się z branży maszyn Rube Goldberg? (Mimo, że wrt 'struct', zobacz http://stackoverflow.com/questions/12930963/creating-a-struct-with-autofixture-throws-no-public-constructor-error) (nie napotkasz żadnej potrzeby' MakeTypedReference 'profesjonalnie i muszę powiedzieć coś tak, jakbym rzeczywiście oglądał strumień tweetów na raz, sry!) –
@RubenBartelink -" dlaczego "było po prostu dla odniesienia. Zrobiłabym "użyj AutoFixture, jeśli to właśnie robiłem. –