[英]C#: How to add an attributes to an object at run-time?
作為一個實體類,我想在運行時添加一個屬性,我該怎么辦?
需要看什么屬性? 如果它是數據綁定等, TypeDescriptor
應該工作:
TypeDescriptor.AddAttributes(type, attribs);
TypeDescriptor.AddAttributes(instance, attribs);
這只會影響System.ComponentModel
使用(不是直接反射),但這通常就足夠了 - 例如,您可以通過上面的方式關聯TypeConverter
。
如果“屬性”你的意思是“屬性”,那么(同樣,就數據綁定而言) TypeDescriptor
也有潛力 - 但它是非平凡的; 您需要在對象上實現ICustomTypeDescriptor
,或者為類型編寫CustomTypeDescriptor
- 在任何一種情況下,您都需要編寫自己的PropertyDescriptor
實現(通常與每個實例字典交談等)。 這將被使用的任何東西使用:
// only works if you use TypeDescriptionProvider
PropertyDescriptorCollection typeProps = TypeDescriptor.GetProperties(type);
// works via TypeDescriptionProvider or ICustomTypeDescriptor
PropertyDescriptorCollection objProps = TypeDescriptor.GetProperties(obj);
同樣,這涵蓋了廣泛的數據綁定和類似場景。 舉個例子, 請看這里 - 然而,這遠非微不足道。 示例用法(來自鏈接)在運行時添加兩個屬性:
Bag.AddProperty<int>("TestProp", new DefaultValueAttribute(5));
Bag.AddProperty<string>("Name");
編輯:請澄清,你是在談論c#屬性還是你班上的成員?
添加c#屬性的唯一方法是使用其他屬性生成一個全新的類,編譯並將新程序集加載到現有的AppDomain。
使用哈希表來存儲您的屬性。
如果您想要更多的運行時靈活性,可以嘗試Ruby或其他一些解釋語言。
看看動態語言運行時。 您也可以考慮使用IronRuby或IronPython等動態語言。
你試圖解決什么問題?
這篇文章為我解答了這個問題:
屬性是類型的元數據的一部分,因此它們在編譯的程序集中被硬編碼(這也是為什么只允許使用某些基本類型而不是屬性的任意數據)。
結果是您無法在運行時向類型添加任何屬性。 但是有各種替代技術。 您可以使用簡單的詞典或更強大的功能,如附加的依賴項屬性 。
我會選擇PostSharp ,一個非常優雅的AOP框架 (或Policy Injection )。
PostSharp 允許您注入自定義屬性 。
在帖子中提到的博客條目有一些代碼可以下載以實現您的目標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.