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

本文关键字:添加 属性 运行时 | 更新日期: 2023-09-27 17:58:09

我有一个类:

class MyClass 
{
}
...
MyClass c = new MyClass();

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

我不知道它们在编译时的类型或名称,而且它们没有我可以使用的通用接口。

psuedo示例:

 Add property named "Prop1" [type System.Int32]
 Add property named "Prop900" [type System.String]

我已经读过这个问题,但它使用接口

提前谢谢。

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

不能在运行时用新成员扩展现有类。但是,您可以使用System创建一个新类。反射将现有类作为基类的发射。

typeBuilder.SetParent(typeof(MyClass));
typeBuilder.DefineProperty("Prop1", ..., typeof(System.Int32), null);
...

请参见TypeBuilder。完整示例的DefineProperty方法(String,PropertyAttributes,Type,Type[])。

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

带反射。您可以编写一个全新的程序集,然后将其加载到内存中。

但是,您不能在运行时更改类。想象一下,你有一个类Foo,你安装了一大堆,然后决定改变这个类。

你已经加入的所有Foo应该怎么办?

然而,你可以使用反射。Emit创建一个继承Foo的新类,称为Bar,然后向该类添加所需的任何内容。

或者,如果您想在编译时之后但运行时之前以编程方式将属性添加到类中,可以查看IL Wiving/AMP。如果你感兴趣的话,我建议你看看PostSharp或Fody。

是的,您可以使用ExpandoObject类来实现这一点。

dynamic expando = new ExpandoObject();
expando.Prop1 = 10;
expando.Prop900 = string.Empty;