是否可以在运行时在类型上创建属性?我的类型“帐户”有一组预定义的属性,例如“ID”和“帐户名称”,它实现了INotifyPropertyChanged,我想在运行时向这个类型添加属性,所以getter和setter以及setter会调用一个方法通知传递它的属性名称即
public string Name
{
get { return _name; }
set
{
_name = value;
NotifyPropertyChanged("Name");
}
}
答案 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
的问题一样您可以做的是通过反射创建新的类类型,它们可以包含新属性。但是没有简单的方法来访问这些