在运行时创建属性

时间:2012-09-19 19:29:41

标签: c#

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

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

4 个答案:

答案 0 :(得分:1)

是的,但不是“普通”CLR类型。你可以实现这一点,实际上这种类型是专门为这样的功能而创建的:DynamicObject

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

public class DynamicDictionary : DynamicObject
{
   ...
}

之后你可以像以下一样使用它:

dynamic person = new DynamicDictionary();

// Adding new dynamic properties.      
person.FirstName = "Ellen";
person.LastName = "Adams";

答案 1 :(得分:1)

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

我必须警告你,这条道路很复杂,你可能会在完成这份工作后制作出你永远无法理解的代码!

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

并且是的,我试图让你害怕这个 ......这是一种痛苦的方式;)

在考虑其他选择之前,先考虑其他选择。

在此问题上已有很多材料:https://stackoverflow.com/questions/tagged/reflection.emit

解释Reflection.Emit的CodeProject文章: Dynamic Type Using Reflection.Emit

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

不,c#对象无法实现

你可以使字典像类一样,它可以存储不同的属性,就像使用DynamicObject

的问题一样

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