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

use*_*175 1 c# default object createinstance

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

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

“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());
        }
    }
Run Code Online (Sandbox Code Playgroud)

预期输出为:

  • 系统.Int32
  • 系统字符串
  • MyNamespace.clsMyClass

结果值将是:

  • b[0] = 0
  • b[1]=“”
  • b[2] = 新的 clsMyClass

Ars*_*yan 5

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

b[i] = Activator.CreateInstance(a[i].GetType());
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

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