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)
预期输出为:
结果值将是:
删除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...)
可以完成这项工作。如果需要,您可以使用反射来调查类型构造函数参数