Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过发射/反射初始化类字段_C#_.net_Reflection_Initialization - Fatal编程技术网

C# 通过发射/反射初始化类字段

C# 通过发射/反射初始化类字段,c#,.net,reflection,initialization,C#,.net,Reflection,Initialization,假设我有三个类A、B和C,它们是通过.NET framework的发射/反射功能生成的,并以以下方式发射对象: class A { B someField1; C someField2; } 创建对象后,我需要初始化someField1和someField2: A someObject; 如何做到这一点?someObject类型是object,但我不知道如何将其转换为动态创建的类型,并输入字段并初始化它。提前感谢您的帮助。您不能在代码中强制转换为动态创建的类型,因为编译器无法知道

假设我有三个类A、B和C,它们是通过.NET framework的发射/反射功能生成的,并以以下方式发射对象:

class A
{
   B someField1;
   C someField2;
}
创建对象后,我需要初始化someField1和someField2:

A someObject;

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

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

您可以通过以下两种方式满足您的需求:

// 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);


只是保罗的后续行动

如果someField1和someField2在编译时是已知的(似乎是这样),那么建议在动态创建的类实现的接口中声明它们。这样,您就可以简单地将someObj的大小写为接口类型

interface IObjectWithFields
{
    B someField;
    C someField;
}

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

谢谢,我不知道动态关键字。
interface IObjectWithFields
{
    B someField;
    C someField;
}

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