English 中文(简体)
通过发射/反射初始化类字段
原标题:Initializing class fields via Emit/Reflection

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

class A
{
   B someField1;
   C someField2;
}

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

A someObject;

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

最佳回答

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

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

// 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;
问题回答

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

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

interface IObjectWithFields
{
    B someField;
    C someField;
}

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




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签