我正在尝试使用反射(最终在编译时未知)object
,其中包括struct
. 我已经做到了,TypedReference.MakeTypedReference
但我撞到了墙。
这是我的类和结构
public class MyObject
{
public int Id;
public Money Amount;
}
public struct Money
{
public int Vaule;
public string Code;
}
这就是我如何尝试使用反射在 MyObject 中设置“金额”的“代码”。正如我上面提到的,我正在寻找一个在编译时不知道这些类型的解决方案(这太容易了!)
这是我到目前为止的代码(我使用 [0]、[1] 使代码更简单)
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 爆炸了;“FieldInfo 与目标类型不匹配。” 同样,如果我只是通过objFields[1]
. 如果只是通过,moneyFields
我会得到“TypedReferences 不能被重新定义为原语”。
为什么?假设我正在创建随机测试装置并想用随机数据填充类字段:)