2009-02-19 64 views

回答

2

編輯:請說清楚,你說的是c# attributes還是你班上的成員?

您可以添加c#屬性的唯一方法是使用其他屬性生成一個全新的類,編譯並將新程序集加載到現有AppDomain。

+0

按類,他的意思是一個全新的類型,同一類的不只是一個實例。 – 2009-02-19 01:18:08

+0

@Joel很對,我可以看到它可能有點模糊。謝謝 – 2009-02-19 01:23:12

1

使用散列表來存儲您的屬性。

如果您想要更多的運行時靈活性,您可以嘗試Ruby或其他解釋型語言。

0

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

其結果是您無法在運行時向類型添加任何屬性。但是有各種各樣的替代技術。你可以使用簡單的字典或更強大的東西,如attached dependency properties

9

什麼需要看到的屬性?如果事情像數據綁定等,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); 

再次,這涉及範圍廣泛的數據綁定和類似的場景。舉一個例子,see here - 但這並不是微不足道的。該示例使用(從鏈接)將在運行兩個屬性:

Bag.AddProperty<int>("TestProp", new DefaultValueAttribute(5)); 
Bag.AddProperty<string>("Name"); 
相關問題