2010-01-04 54 views
8

值類型的實例,我要像創建值類型的實例System.StringSystem.BooleanSystem.Int32,等我拿到的類型合格的名字,如System.StringMyNamespace.Employee,我要創造一個實例並返回。我使用Activator.CreateInstanceFormatterServices.GetUninitializedObject來創建實例。但在價值類型的情況下它失敗。在值類型的情況下,我不能硬編碼邏輯。我需要一種通用的方法來創建值類型和引用類型的實例。如何創建使用反射

+3

System.String是引用類型,而不是值類型。 – 2010-01-04 06:30:55

回答

11

你究竟想要做什麼?主要使用FormatterServices.GetUninitializedObject作爲序列化代碼;除此之外,你不應該真的使用它。這聽起來你可能只需要像TypeConverter,即(這些類型)

TypeConverter tc = TypeDescriptor.GetConverter(someType); 
object obj = tc.ConvertFromString(s); 
+0

感謝它的幫助。 – 2010-01-04 06:40:37

+0

哦,可愛的通用的東西:) – Nyerguds 2018-02-15 21:54:44

3

到底是什麼故障?我想下面的代碼,看看是否有與值類型的問題:

var instance = Activator.CreateInstance(typeof(Int32)); 

它給了我一個Int32實例設置爲0。

究竟哪裏是你的代碼失敗?否則,我會說問題在於你加載類型的方式,而不是你創建實例的方式。

+0

Eish哈科!我剛剛回去將'var'改爲'int',以防OP中不熟悉'var',並且你偷偷在與我完全相同的代碼行中。 :-) – ProfK 2010-01-04 06:36:36

+0

哈哈 - 你必須快速抽籤:-) – 2010-01-04 07:00:36

0

這個工作對我來說:

int x = (int)Activator.CreateInstance(typeof (Int32), true); 
1

對於BCL值類型(以及使用字符串時描述的類型),確保不使用C#的關鍵字,並確保該類型與命名空間完全合格。例如,C#INT成功創建這種方式與Activator.CreateInstance(..)

object num = Activator.CreateInstance(Type.GetType("System.Int32")); 

如果您嘗試使用特定語言的別名一樣"int"或短格式,如:"Int32"你將得到一個失敗的嘗試。