以下示例显示了意图。该示例是迭代对象数组,并创建具有相同类型的数组,并使用默认值加载。这些值本身不需要从一个列表复制到下一个列表。这就是" 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());
}
}
预期输出为:
结果值为:
答案 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...)
可以完成这项工作。
如果需要,您可以使用反射来调查类型构造函数参数