如何创建存储在对象变量中的对象的新默认实例?

时间:2012-11-29 22:54:15

标签: c# object default createinstance

以下示例显示了意图。该示例是迭代对象数组,并创建具有相同类型的数组,并使用默认值加载。这些值本身不需要从一个列表复制到下一个列表。这就是" Type Clone"列表。

以下代码为Activator产生以下错误:

" System.Int32不是GenericTypeDefinition。 MakeGenericType只能在Type.IsGenericTypeDefinition为true的类型上调用。"

Activator,CreateInstance和MakeGenericType的细节对我来说仍然有点混乱。

如何更改代码以避免错误?

任何建议都将不胜感激。

    private void Test()
    {
        object[] a = new object[] {100, "Text", new clsMyClass()};
        object[] b = new object[a.Length];

        for (int i = 0; i < a.Length; i++)
        {
            b[i] = Activator.CreateInstance(a[i].GetType().MakeGenericType());
        }

        for (int i = 0; i < b.Length; i++)
        {
            Console.WriteLine(b[i].GetType().ToString());
        }
    }

预期输出为:

  • System.Int32
  • System.String
  • MyNamespace.clsMyClass

结果值为:

  • b [0] = 0
  • b [1] =&#34;&#34;
  • b [2] = new clsMyClass

1 个答案:

答案 0 :(得分:3)

删除MakeGenericType()它将开始工作,使用此

b[i] = Activator.CreateInstance(a[i].GetType());

MakeGenericType用于替换定义的泛型参数。 例如,如果您的数组包含List<T>,则a[i].GetType().MakeGenericType(typeof(int))的调用将返回类型List<int>

在你的情况下,我没有看到任何泛型类型,所以我想知道你为什么要使用它

另请注意,只有在类型具有无参数构造函数的情况下调用Activator.CreateInstance才会起作用,例如在string的情况下不行。你可以像这样处理string案例

for (int i = 0; i < a.Length; i++)
{
   var oType = a[i].GetType();
   if (oType == typeof(string)) 
       b[i] = string.Empty; //or may be null 
   else
       b[i] = Activator.CreateInstance(oType);
}

对于没有无参数构造函数的所有类型,应该做类似的事情。 Activator.CreateInstance(type, parameters...)可以完成这项工作。  如果需要,您可以使用反射来调查类型构造函数参数