![](/img/trans.png)
[英]How to add properties to a class at runtime in c# - From JSON file
[英]How Can I add properties to a class on runtime in C#?
我有一節課:
class MyClass
{
}
...
MyClass c = new MyClass();
是否可以在運行時向此類添加屬性/字段?
( 我不知道它們在編譯時的類型或名稱是什么,它們沒有我可以使用的通用接口。 )
假的例子:
Add property named "Prop1" [type System.Int32]
Add property named "Prop900" [type System.String]
我已經閱讀了這個問題,但它使用了界面
提前致謝。
您無法在運行時使用新成員擴展現有類。 但是,您可以使用System.Reflection.Emit創建一個新類,該類具有現有類作為基類。
typeBuilder.SetParent(typeof(MyClass));
typeBuilder.DefineProperty("Prop1", ..., typeof(System.Int32), null);
...
有關完整示例,請參見TypeBuilder.DefineProperty方法(String,PropertyAttributes,Type,Type []) 。
我想你誤解了反思是什么。 反射不允許您更改正在運行的代碼。 它可以讓您閱讀自己的代碼,甚至運行該代碼。
使用Reflection.Emit,您可以編寫一個全新的程序集,然后將其加載到內存中。
但是,您無法在運行時更改類。 想象一下,你有一個Foo類,你實現了一大堆,然后決定改變這個類。
你已經實施的所有Foos應該怎么辦?
但是,您可以使用Reflection.Emit創建一個繼承Foo的新類,稱為Bar,然后向該類添加所需的任何內容。
或者,如果要在編譯時間之后以編程方式將屬性添加到類,但在運行時之前,可以查看IL Weaving / AOP。 如果這是您感興趣的話,我建議您查看PostSharp或Fody 。
是的,您可以使用ExpandoObject
類來實現此目的。
dynamic expando = new ExpandoObject();
expando.Prop1 = 10;
expando.Prop900 = string.Empty;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.