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 []).
我认为您误解了反射是什么。反射不允许您更改正在运行的代码。它可以让您阅读自己的代码,甚至运行该代码。
使用Reflection.Emit,您可以编写一个全新的程序集,然后将其加载到内存中。
但是,您不能在运行时更改类。想象一下,您有一个Foo班,您实例化了一大堆,然后决定更改班级。
您已经实例化的所有Foos应该如何处理?
但是,您可以使用Reflection.Emit创建一个继承Foo的新类(称为Bar),然后将所需的内容添加到该类中。
另外,如果要在编译后但运行前,以编程方式向类添加属性,则可以查看IL Weaving / AOP。如果您对此感兴趣,我建议您查看PostSharp或Fody。
| 归档时间: |
|
| 查看次数: |
38227 次 |
| 最近记录: |