在反思的对象struct的接入领域(Access fields of a Struct in an

2019-08-02 12:31发布

我试图使用反射(最终在编译时未知) object ,其中包括struct 。 据我已经得到了TypedReference.MakeTypedReference但我碰了壁。

这里是我的class和struct

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吹了; “字段信息不匹配目标类型。” 同样,如果我传递objFields[1] 如果只是通过moneyFields我得到“TypedReferences不能被重新定义为基元。”

为什么? 比方说,我创建随机测试夹具和要填充用随机数据类字段:)

Answer 1:

坦率地说,没有必要对任何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);

然而! 我会告诉你的几件事情:

  • 公共领域,而不是性能通常不是一个好主意; 这往往会咬你以后
  • 可变结构(可创建之后不得更改,即结构) 几乎从来没有一个好主意,会咬人,甚至更多的时候,咬较硬
  • 结合可变的结构和公共领域的化合物,但使它很成问题以后更改


文章来源: Access fields of a Struct in an Object with Reflection