C# 如何使用反射创建值类型的实例
我想创建一个值类型的实例,如C# 如何使用反射创建值类型的实例,c#,.net,reflection,value-type,C#,.net,Reflection,Value Type,我想创建一个值类型的实例,如System.String,System.Boolean,System.Int32,等等。我得到了System.String或MyNamespace.Employee等类型的限定名称,我必须创建一个实例并返回。我使用Activator.CreateInstance和FormatterServices.GetUninitializedObject创建实例。但在值类型的情况下,它会失败。对于值类型,我无法硬编码逻辑。我需要一种创建值类型和引用类型实例的通用方法。您到底想做
System.String
,System.Boolean
,System.Int32
,等等。我得到了System.String
或MyNamespace.Employee
等类型的限定名称,我必须创建一个实例并返回。我使用Activator.CreateInstance
和FormatterServices.GetUninitializedObject
创建实例。但在值类型的情况下,它会失败。对于值类型,我无法硬编码逻辑。我需要一种创建值类型和引用类型实例的通用方法。您到底想做什么FormatterServices.GetUninitializedObject
主要由序列化代码使用;除此之外,你不应该真正使用它。听起来您可能只需要TypeConverter
,即(对于这些类型)
失败到底是什么?我尝试了以下代码以查看值类型是否存在问题:
var instance = Activator.CreateInstance(typeof(Int32));
它为我提供了一个设置为0的Int32实例
你的代码到底在哪里失败了?否则,我会说问题在于加载类型的方式,而不是创建实例的方式。这对我很有用:
int x = (int)Activator.CreateInstance(typeof (Int32), true);
对于BCL值类型(以及使用字符串描述类型时),请确保未使用C#关键字,并确保该类型完全符合命名空间。例如,C#int是通过Activator.CreateInstance(..)以这种方式成功创建的
如果尝试使用特定于语言的别名(如
“int”
)或缩写形式(如“Int32”
)System.String是引用类型,而不是值类型,则尝试将失败。Eish Jaco!我只是回去把我的'var'改成'int',以防OP不熟悉'var',而你偷偷地输入了与我完全相同的代码行。:-)哈哈-你必须画得很快:-)哦,很适合一般的东西:)
int x = (int)Activator.CreateInstance(typeof (Int32), true);
object num = Activator.CreateInstance(Type.GetType("System.Int32"));