簡體   English   中英

如何在C#中在運行時向類添加屬性?

[英]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。 如果這是您感興趣的話,我建議您查看PostSharpFody

是的,您可以使用ExpandoObject類來實現此目的。

dynamic expando = new ExpandoObject();
expando.Prop1 = 10;
expando.Prop900 = string.Empty;

暫無
暫無

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

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