簡體   English   中英

如何在運行時使用Reflection創建值類型或字符串類型對象

[英]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在生成表單上的控件的代碼隱藏時使用的機制,因此,對於顯示為可從設計器訪問的控件屬性的常見類型,它支持該機制。

int類型沒有任何構造函數

您編寫的代碼將取決於屬性的類型。 通常,您會為stringint和其他原始類型編寫特殊情況的代碼。

上面的代碼包含文字0; 您如何確定要傳遞給構造函數的值?

暫無
暫無

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

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