通过Emit / Reflection初始化类字段

时间:2011-05-28 05:58:51

标签: c# .net reflection initialization

假设我有三个类A,B和C通过.NET框架的发射/反射功能生成,并以下列方式发送对象:

class A
{
   B someField1;
   C someField2;
}

我需要在创建对象后初始化someField1和someField2:

A someObject;

怎么做? someObject类型是object,但我不知道如何将它转换为动态创建的类型并输入字段并初始化它。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

您无法在代码中强制转换为动态创建的类型,因为编译器无法知道该类型。

您可以通过以下几种方式完成所需的工作:

// 1 - using reflection
// these will actually be your dynamically created objects...
object a = CreateA();
object b = CreateB();
System.Reflection.FieldInfo someField1 = a.GetType().GetField(
    "someField1", 
    BindingFlags.Instance | BindingFlags.NonPublic);
someField1.SetValue(a, b);

// 2 - using dynamic (C# 4)
dynamic a = CreateA();
dynamic b = CreateB();
a.someField1 = b;

答案 1 :(得分:0)

只是保罗的后续行动......

如果someField1和someField2在编译时是已知的(看起来就是这种情况),那么建议在动态创建的类实现的接口中声明它们。这样你就可以简单地将someObj称为接口类型。

interface IObjectWithFields
{
    B someField;
    C someField;
}

object a = CreateA();
((IObjectWIthFields)a).someField1 = CreateB();