如何使用Reflection在运行时创建值类型或字符串类型对象

Erk*_* Y. 1 c# reflection object instantiation

可能简单但无法弄清楚.我在运行时加载程序集并浏览一些类并为其属性生成输入控件.要在运行时创建对象的实例,我使用:

  object o =  PropertyType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, null, Type.EmptyTypes,null).Invoke(null);
Run Code Online (Sandbox Code Playgroud)

它适用于类类型.当类型是数组时,我使用

  object o =  PropertyType.Type.GetConstructor(new Type[] { typeof(int) }).Invoke(new object[] { 0 });
Run Code Online (Sandbox Code Playgroud)

这也很好.但是当涉及到字符串类型或值类型时,GetConstructor.Invoke不起作用.我也尝试过Activator.CreateInstance也没用.

Jon*_*eet 8

您遇到的是值类型实际上没有无参数构造函数.C#使它看起来像他们一样,但它们不在CLR级别.

Activator.CreateInstance 应该适用于实际价值类型:

object o = Activator.CreateInstance(typeof(int));
Console.WriteLine(o); // Prints 0
Run Code Online (Sandbox Code Playgroud)

这将始终为任何值类型提供默认值.

现在,你问的是字符串 - 你期望创建什么字符串?该string类型的默认值为null - 但是您想要空字符串吗?如果是这样,您将需要特殊情况下的代码.