如何在C#中在运行时向类添加属性?

Roy*_*mir 14 .net c# reflection properties .net-4.0

我有一节课:

class MyClass 
{
}
...
MyClass c = new MyClass();
Run Code Online (Sandbox Code Playgroud)

是否可以在运行时向此类添加属性/字段?

(我不知道它们在编译时的类型或名称是什么,它们没有我可以使用的通用接口.)

假的例子:

 Add property named "Prop1" [type System.Int32]
 Add property named "Prop900" [type System.String]
Run Code Online (Sandbox Code Playgroud)

我已经阅读了这个问题,但它使用了界面

提前致谢.

dtb*_*dtb 34

您无法在运行时使用新成员扩展现有类.但是,您可以使用System.Reflection.Emit创建一个新类,该类具有现有类作为基类.

typeBuilder.SetParent(typeof(MyClass));
typeBuilder.DefineProperty("Prop1", ..., typeof(System.Int32), null);
...
Run Code Online (Sandbox Code Playgroud)

有关完整示例,请参见TypeBuilder.DefineProperty方法(String,PropertyAttributes,Type,Type []).

  • 我已经成功做到了。谢谢。(就是这样)。感谢您_回答_实际问题。 (3认同)

Aro*_*ron 5

我认为您误解了反射是什么。反射不允许您更改正在运行的代码。它可以让您阅读自己的代码,甚至运行该代码。

使用Reflection.Emit,您可以编写一个全新的程序集,然后将其加载到内存中。

但是,您不能在运行时更改类。想象一下,您有一个Foo班,您实例化了一大堆,然后决定更改班级。

您已经实例化的所有Foos应该如何处理?

但是,您可以使用Reflection.Emit创建一个继承Foo的新类(称为Bar),然后将所需的内容添加到该类中。

另外,如果要在编译后但运行前,以编程方式向类添加属性,则可以查看IL Weaving / AOP。如果您对此感兴趣,我建议您查看PostSharpFody