2010-01-04 53 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"你将得到一个失败的尝试。