【问题标题】:How to create new default instances of objects that are stored in object variables?如何创建存储在对象变量中的对象的新默认实例?
【发布时间】:2012-11-29 22:54:15
【问题描述】:

下面的示例显示了意图。该示例正在遍历一个对象数组,并创建一个加载了默认值的相同类型的数组。值本身不需要从一个列表复制到下一个列表。这是列表的“类型克隆”。

下面的代码为激活器产生以下错误:

“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] = ""
  • b[2] = 新的 clsMyClass

【问题讨论】:

    标签: c# object default createinstance


    【解决方案1】:

    删除MakeGenericType(),它会开始工作,使用这个

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

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

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

    还要注意,像这样调用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...) 可以胜任。 如果需要,您可以使用反射来调查类型构造函数参数

    【讨论】:

    • 是的,当然,这是另一个问题:)
    • + 但由于string 没有无参数构造函数,因此无法工作。 stackoverflow.com/a/2092912/284240
    • 这很容易!非常感谢 ArsenMkrt !我一直在搞乱默认原语,并开始根据示例代码使用 Activator。我想我放弃得太早了,只需要少一点代码。
    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 2021-09-19
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多