Ian*_*ley 12 c# reflection typedreference
我正在尝试使用反射(最终在编译时未知)object,包括struct.我已经到了,TypedReference.MakeTypedReference但我已经撞墙了.
这是我的班级和结构
public class MyObject
{
public int Id;
public Money Amount;
}
public struct Money
{
public int Vaule;
public string Code;
}
Run Code Online (Sandbox Code Playgroud)
这是我如何尝试使用反射在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" );
Run Code Online (Sandbox Code Playgroud)
TypedReference.MakeTypedReference爆炸了; "FieldInfo与目标类型不匹配." 同样,如果我只是通过objFields[1].如果通过,moneyFields我会得到"TypedReferences不能重新定义为原语".
为什么?假设我正在创建随机测试夹具,并希望用随机数据填充类字段:)
Mar*_*ell 18
坦率地说,这里没有任何需要TypedReference- 只需一个盒装结构应该可以正常工作:
var amountField = obj.GetType().GetField("Amount");
object money = amountField.GetValue(obj);
var codeField = money.GetType().GetField("Code");
codeField.SetValue(money, "XXX");
amountField.SetValue(obj, money);
Run Code Online (Sandbox Code Playgroud)
然而!我会告诉你一些事情: