[英]How to create a value type or string type object at runtime using Reflection
可能很簡單,但無法弄清楚。 我在運行時加載程序集並瀏覽一些類並為其屬性生成輸入控件。 要在運行時創建對象的實例,我正在使用:
object o = PropertyType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, null, Type.EmptyTypes,null).Invoke(null);
它適用於類類型。 當類型是數組時,我使用
object o = PropertyType.Type.GetConstructor(new Type[] { typeof(int) }).Invoke(new object[] { 0 });
這也很好用。 但是當涉及字符串類型或值類型時,GetConstructor.Invoke不起作用。 我也嘗試了Activator.CreateInstance也不起作用。
您遇到的是,值類型實際上沒有無參數的構造函數。 C#使它們看起來像它們,但是它們不在CLR級別。
Activator.CreateInstance
應該可以用於實數值類型,但是:
object o = Activator.CreateInstance(typeof(int));
Console.WriteLine(o); // Prints 0
這將始終為任何值類型提供默認值。
現在,您正在詢問字符串-您希望創建什么字符串? string
類型的默認值為null-但您是否希望使用空字符串? 如果是這樣,則需要對該代碼進行特殊情況處理。
如果要實例化具有特定值的任意對象,可以檢查的一件事是是否存在一個TypeConverter,它支持將實例(具有要匹配的值)轉換為InstanceDescriptor 。 我不完全確定您在做什么(您的示例建議您嘗試創建不同對象的“默認”實例),但是我只是想在相關的情況下提及這一點。 我在Emit代碼中使用它通過IL向棧發出任意常量值。 這是獲取InstanceDescriptor的代碼段:
var converter = TypeDescriptor.GetConverter(value);
if (converter.CanConvertTo(typeof (InstanceDescriptor)))
{
var desc = (InstanceDescriptor) converter.ConvertTo(value, typeof (InstanceDescriptor));
}
描述符指定了構造實例的方法,該方法可以是調用構造函數,調用靜態方法,訪問靜態屬性或訪問靜態字段。 它還指定構造是否完全設置類型的值以匹配您的原始實例。 如果不是,則需要進行其他反射和屬性設置。
這是WinForms Designer在生成表單上的控件的代碼隱藏時使用的機制,因此,對於顯示為可從設計器訪問的控件屬性的常見類型,它支持該機制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.