作爲一個實體類,我想在運行時添加一個屬性,我應該怎麼做?C#:如何在運行時向對象添加屬性?
回答
編輯:請說清楚,你說的是c# attributes還是你班上的成員?
您可以添加c#屬性的唯一方法是使用其他屬性生成一個全新的類,編譯並將新程序集加載到現有AppDomain。
使用散列表來存儲您的屬性。
如果您想要更多的運行時靈活性,您可以嘗試Ruby或其他解釋型語言。
屬性是類型的元數據的一部分,因此它們在編譯後的程序集中被硬編碼(這也是爲什麼您只允許在屬性處使用一些基本類型而不是任意數據的原因)。
其結果是您無法在運行時向類型添加任何屬性。但是有各種各樣的替代技術。你可以使用簡單的字典或更強大的東西,如attached dependency properties。
看看動態語言運行時。你也可以考慮IronRuby或IronPython這樣的動態語言。
你試圖解決什麼問題?
什麼需要看到的屬性?如果事情像數據綁定等,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");
我會去與PostSharp,一個非常優雅的AOP framework(或政策注入)。
PostSharp allows you to inject custom attributes。
在帖子中提到的博客條目中有一些代碼可以下載以實現您的目標。
這篇文章回答了這個對我來說:
- 1. 如何在運行時向css屬性添加值?
- 2. 在運行時添加屬性到Javascript對象
- 3. 的Javascript添加事件,在運行時對象屬性
- 4. 如何在C#中訪問動態對象時添加屬性
- 5. 在運行時向對象添加屬性並保存到數據庫
- 6. 添加expando屬性的類型的對象在運行時,在c#
- 7. 雙向樣資源的屬性和運行時對象屬性
- 8. javascript-向數組對象添加屬性
- 9. 在運行時添加屬性
- 10. Castle.DynamicProxy2並添加屬性在運行時
- 11. yii2在運行時添加屬性
- 12. 如何將運行時參數命名的屬性添加到動作對象?
- 13. onserverclick在運行時添加屬性時不會觸發c#
- 14. 如何給對象添加屬性?
- 15. 如何將屬性添加到對象?
- 16. 在運行期間未發生對象添加屬性
- 17. 如何在運行時在Converter對象上設置屬性
- 18. Knockout在運行時添加子對象
- 19. 如何在運行時在spring中爲bean添加屬性
- 20. Java - 屬性:在運行時向屬性文件添加新的鍵?
- 21. 添加屬性的對象
- 22. 添加屬性JSON對象
- 23. 如何以編程方式在運行時向topojson文件添加屬性?
- 24. 如何在運行時設置對象的各種屬性?
- 25. 在Objective c中添加屬性運行時
- 26. 在運行時動態添加C#屬性
- 27. 在運行時向函數對象添加方法
- 28. 正在向運行時緩慢的list()對象添加?
- 29. 在運行時向對象添加任意類型
- 30. 如何在運行時將屬性添加到方法?
按類,他的意思是一個全新的類型,同一類的不只是一個實例。 – 2009-02-19 01:18:08
@Joel很對,我可以看到它可能有點模糊。謝謝 – 2009-02-19 01:23:12