2010-06-28 42 views
1

可能很簡單,但無法弄清楚。我在運行時加載程序集並瀏覽一些類併爲其屬性生成輸入控件。要在運行時創建一個對象的實例,我正在使用:如何在運行時使用反射創建值類型或字符串類型對象

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,這也沒有工作。

回答

8

你碰到的是,值類型並沒有真正的無參數構造函數。 C#使它看起來像,但它們不在CLR級別。

Activator.CreateInstance應該可以正常工作了,雖然真正的價值類型:

object o = Activator.CreateInstance(typeof(int)); 
Console.WriteLine(o); // Prints 0 

這將始終給出任何值類型的默認值。

現在,你在問關於字符串 - 你期望創建什麼字符串? string類型的默認值爲null - 但是您想要空字符串嗎?如果是這樣,你需要特殊的代碼。

+0

感謝Jon,我編輯了我的問題,並不是說string是一個值類型...那麼字符串實例化怎麼樣? – 2010-06-28 15:38:43

+0

@Erkan:我編輯了我的答案。你想創建什麼字符串?如果你選擇一個實際存在的構造函數,你當然可以用反射來調用它 - 但是當然你需要提供參數的值...... – 2010-06-28 16:04:44

+0

只是想實例化一個類型爲string的動態類屬性,但是我不想要創建的對象中的空值。所以我想我需要在類中爲字符串類型屬性做特殊情況。仍然不清楚如何從字符串類型類屬性創建對象實例。因爲我會做一個特例:if(property.PropertyType == typeof(string))object o =「」;足夠嗎? – 2010-06-28 16:43:31

0

int類型doesn't have any constructors

您編寫的代碼將取決於屬性的類型;通常,您會爲stringint和其他基本類型編寫特殊代碼。

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

0

如果您希望能夠使用特定值實例化任意對象,您可以檢查的一件事是,是否存在支持將實例(具有要匹配的值)轉換爲InstanceDescriptor的實例的TypeConverter。我並不完全確定你在做什麼(你的例子表明你正在試圖創建不同對象的'默認'實例),但只是想我會提到這個以防萬一它是相關的。我在發射代碼中使用它通過IL向堆棧發射任意常量值。下面是得到初始化InstanceDescriptor的片段:

 var converter = TypeDescriptor.GetConverter(value); 
     if (converter.CanConvertTo(typeof (InstanceDescriptor))) 
     { 
      var desc = (InstanceDescriptor) converter.ConvertTo(value, typeof (InstanceDescriptor)); 
     } 

的描述符指定創建實例,它可以調用構造函數,調用一個靜態方法,訪問靜態屬性或訪問靜態字段的方法。它還指定結構是否完全設置類型的值以匹配原始實例;如果沒有,你需要做額外的反射和設置屬性。

這是WinForms Designer在爲窗體上的控件生成代碼隱藏時使用的機制,因此它支持顯示爲可從設計器訪問的控件屬性的常見類型。

相關問題