C# 如何在运行时使用反射创建值类型或字符串类型对象

C# 如何在运行时使用反射创建值类型或字符串类型对象,c#,reflection,object,instantiation,C#,Reflection,Object,Instantiation,可能很简单,但无法理解。我在运行时加载程序集,浏览一些类,并为其属性生成输入控件。要在运行时创建对象的实例,我正在使用: object o = PropertyType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, null, Type.EmptyTypes,null).Invoke(null); 对于类类型来说,它工作得很好。当类型为数组时,我使用 objec

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

  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,但它也不起作用。

您遇到的问题是,值类型实际上没有无参数构造函数。C使其看起来像是这样,但在CLR级别则不是这样

Activator.CreateInstance对于实际值类型应该可以正常工作,但:

object o = Activator.CreateInstance(typeof(int));
Console.WriteLine(o); // Prints 0
这将始终为任何值类型提供默认值


现在,您正在询问字符串-您希望创建什么字符串?字符串类型的默认值为null-但您是否希望改为空字符串?如果是这样的话,您需要对代码进行特殊处理。

您遇到的是,值类型实际上没有无参数构造函数。C使其看起来像是这样,但在CLR级别则不是这样

Activator.CreateInstance对于实际值类型应该可以正常工作,但:

object o = Activator.CreateInstance(typeof(int));
Console.WriteLine(o); // Prints 0
这将始终为任何值类型提供默认值

现在,您正在询问字符串-您希望创建什么字符串?字符串类型的默认值为null-但您是否希望改为空字符串?如果是这样,您将需要对该代码进行特殊处理。

int类型

您编写的代码将取决于属性的类型;通常,您会为string、int和其他基本类型编写特殊的大小写代码

上面的代码包含文本0;如何确定要传递给构造函数的值?

int类型

您编写的代码将取决于属性的类型;通常,您会为string、int和其他基本类型编写特殊的大小写代码


上面的代码包含文本0;如何确定要传递给构造函数的值?

如果希望能够用特定值实例化任意对象,可以检查是否有TypeConverter支持将实例的值转换为要匹配的值。我不完全确定你们在做什么,你们的例子表明你们在尝试创建不同对象的“默认”实例,但我想我会提到这一点,以防万一。我在Emit代码中使用它通过IL向堆栈发送任意常量值。下面是获取InstanceDescriptor的代码段:

        var converter = TypeDescriptor.GetConverter(value);
        if (converter.CanConvertTo(typeof (InstanceDescriptor)))
        {
            var desc = (InstanceDescriptor) converter.ConvertTo(value, typeof (InstanceDescriptor));
        }
描述符指定构造实例的方法,可以是调用构造函数、调用静态方法、访问静态属性或访问静态字段。它还指定构造是否完全设置类型的值以匹配原始实例;如果没有,则需要进行额外的反射和属性设置


这是WinForms Designer在为窗体上的控件生成代码时使用的机制,因此它支持显示为可从设计器访问的控件属性的常见类型。

如果您希望能够实例化具有特定值的任意对象,您可以检查的一件事是,是否有一个TypeConverter支持将一个实例的值转换为您想要匹配的值。我不完全确定你们在做什么,你们的例子表明你们在尝试创建不同对象的“默认”实例,但我想我会提到这一点,以防万一。我在Emit代码中使用它通过IL向堆栈发送任意常量值。下面是获取InstanceDescriptor的代码段:

        var converter = TypeDescriptor.GetConverter(value);
        if (converter.CanConvertTo(typeof (InstanceDescriptor)))
        {
            var desc = (InstanceDescriptor) converter.ConvertTo(value, typeof (InstanceDescriptor));
        }
描述符指定构造实例的方法,可以是调用构造函数、调用静态方法、访问静态属性或访问静态字段。它还指定构造是否完全设置类型的值以匹配原始实例;如果没有,则需要进行额外的反射和属性设置


这是WinForms Designer在为窗体上的控件生成代码时使用的机制,因此它支持显示为可从设计器访问的控件属性的常见类型。

谢谢Jon,我编辑了我的问题,并不是说字符串是值类型。。。那么字符串实例化呢?@Erkan:我已经编辑了我的答案。要创建什么字符串?如果你选择了一个实际存在的构造函数,你当然可以通过反射来调用它——但是你当然需要提供参数的值……只是想动态实例化一个string类型的类属性,但我不想在创建的对象中使用null值。所以我想我需要为字符串做一个特例
在类中键入属性。但仍然不清楚如何从字符串类型类属性创建对象实例。因为我会做一个特例:if property.PropertyType==TypeOfsString对象o=;足够吗?@Erkan:是的,够了。但是所有其他值类型的默认值真的有用吗?你能提供一些关于你将如何处理这个值的更多信息吗?也许有更好的方法。谢谢Jon,我编辑了我的问题,并不是说字符串是值类型。。。那么字符串实例化呢?@Erkan:我已经编辑了我的答案。要创建什么字符串?如果你选择了一个实际存在的构造函数,你当然可以通过反射来调用它——但是你当然需要提供参数的值……只是想动态实例化一个string类型的类属性,但我不想在创建的对象中使用null值。所以我想我需要对类中的字符串类型属性进行特殊处理。但仍然不清楚如何从字符串类型类属性创建对象实例。因为我会做一个特例:if property.PropertyType==TypeOfsString对象o=;足够吗?@Erkan:是的,够了。但是所有其他值类型的默认值真的有用吗?你能提供一些关于你将如何处理这个值的更多信息吗?也许有更好的方法。