繁体   English   中英

如何在C#中为类动态添加字段?

[英]How can I dynamically add a field to a class in C#

有没有办法在运行时向类添加Field (或FieldInfo ,也许这是相同的)?

您无法在运行时更改类定义。 但是,您可以创建一个继承自原始类的新类(如果它未sealed )并声明该字段。 您可以通过使用System.Reflection.Emit发出适当的IL代码来完成此操作。

C#不允许它,因为它的所有类都基于元数据。 CLR (不是C#)不允许在运行时向元数据添加字段(1)。 这是C#能够在runitme添加字段的唯一方法。

这与IronPython等动态语言不同,后者基本上没有具体的元数据类。 它们具有更多动态结构,可以在运行时更改。 我相信IronPython只是将它的成员(字段和方法)保留在可以在运行时轻松更改的哈希表中。

在C#3.0中,您最好的资源是使用Reflection.Emit。 但是这会产生一个全新的类而不是改变现有的类。

(1)某些API(例如分析API或ENC)允许这样做,但我不确定它们的功能是否扩展到添加字段。

不,C#不允许猴子修补

您可以使用CodeDOM或Reflection.Emit生成类,但不能修改现有类。

通过将ExpandoObject作为IDictionary进行转换,可以在C#4.0中通过简单的方法查看此问题 ,这会使添加到字典中的值成为对象的属性。 我在另一个答案中证明了这一点,表明它们实际上已成为属性。

但是,这只能通过ExpandoObject的实例或通过对DynamicObject进行子类化来实现。

如果它们实现IDynamicMetaObjectProvider ,也可以与其他类一起使用,但我认为有太多的工作要让它正常工作。

不完全是。

但是,您可以实现ICustomTypeDescriptor来近似它,然后只使用哈希表来存储字段名/值对。 很多使用反射的框架首先要求ICustomTypeDescriptor。

直到C#4.0增加动态查找并且基于包含DLR的CLR 4.0,然后它不会严格地添加到类中,因为类不会出现在图片中。

正如其他人已经说过的那样,这是不可能的。 你的问题是什么原因? 如果你需要动态地在类中存储一些额外的数据,那么你可能只是使用字典:

class My { 
   Dictionary<string, object> data;
   public My() { data = new Dictionary<string, object>(); }
}

..但这真的取决于你真正想要实现的目标?

也许你可以使用Decorator模式。

在面向对象的编程中,装饰器模式是一种设计模式,它允许将行为静态或动态地添加到单个对象,而不会影响同一类中其他对象的行为。

http://www.dofactory.com/Patterns/PatternDecorator.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM