0

是否可以在运行时在类型上创建属性?我的类型“Account”有一组预定义的属性,例如“ID”和“Account Name”,它实现了 INotifyPropertyChanged,我想在运行时向这个类型添加属性,所以 getter 和 setter 和 setter 会调用一个方法通知传入它的属性名称,即

public string Name
{
     get { return _name; }
     set
     {
          _name = value;
          NotifyPropertyChanged("Name");
     }
}
4

4 回答 4

1

是的,但不是“正常”CLR类型。您可以实现这一点,实际上该类型是专门为以下功能创建的:DynamicObject

查看提供的实现类的示例代码 DynamicObject例如

public class DynamicDictionary : DynamicObject
{
   ...
}

在你能够像这样使用它之后:

dynamic person = new DynamicDictionary();

// Adding new dynamic properties.      
person.FirstName = "Ellen";
person.LastName = "Adams";
于 2012-09-19T19:31:10.573 回答
1

您可以使用Reflection.Emit动态创建从您的类继承的新类,然后将属性添加到该新类型。由于它继承了您自己的类型,因此可以将其视为该类型的“扩展”。

我必须警告你,这条路很复杂,你可能会写出完成工作后再也看不懂的代码!

您还将了解 MSIL 代码的工作原理。这有点奇怪,而且是颠倒的。您必须以与 C# 等语言所期望的完全相反的方式做事。您必须从堆栈中推送和弹出值以作为参数传递给函数,并且您必须主动丢弃函数中未使用的返回值......等等。

是的,我想让你害怕这个……这是一种痛苦的方式;)

在落入这个之前考虑其他替代方案。

SO中已经有很多关于这个问题的材料:https ://stackoverflow.com/questions/tagged/reflection.emit

CodeProject 文章解释 Reflection.Emit: 使用 Reflection.Emit 的动态类型

于 2012-09-19T20:30:49.783 回答
0

您要么使用动态对象,要么通过扩展方法扩展行为。我不知道其他选择。

于 2012-09-19T19:32:26.333 回答
-1

不,这对于 c# 对象是不可能的

你可以像类一样制作字典,它可以存储不同的属性,比如在 DynamicObject 的问题中

你可以做的是通过反射创建新的类类型,它们可以包含新的属性。但是没有简单的方法可以访问这些

于 2012-09-19T19:33:10.353 回答