簡體   English   中英

C#:如何在運行時向對象添加屬性?

[英]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等動態語言。

你試圖解決什么問題?

http://en.wikipedia.org/wiki/Dynamic_Language_Runtime

這篇文章為我解答了這個問題:

在運行時動態創建類型

屬性是類型的元數據的一部分,因此它們在編譯的程序集中被硬編碼(這也是為什么只允許使用某些基本類型而不是屬性的任意數據)。

結果是您無法在運行時向類型添加任何屬性。 但是有各種替代技術。 您可以使用簡單的詞典或更強大的功能,如附加的依賴項屬性

我會選擇PostSharp ,一個非常優雅的AOP框架 (或Policy Injection )。

PostSharp 允許您注入自定義屬性
在帖子中提到的博客條目有一些代碼可以下載以實現您的目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM