如何使用Reflection创建C#数组并仅键入info?

Mar*_*ata 42 c# arrays reflection constructor

我无法弄清楚如何使这项工作:

object x = new Int32[7];
Type t = x.GetType();

// now forget about x, and just use t from here.

// attempt1 
object y1 = Activator.CreateInstance(t); // fails with exception

// attempt2
object y2 = Array.CreateInstance(t, 7);  // creates an array of type Int32[][] ! wrong
Run Code Online (Sandbox Code Playgroud)

什么是秘诀?如果我能得到数组元素的类型,我可以使第二个工作,但我也没有想到那个.

Jon*_*eet 59

您需要Type.GetElementType()获取非数组类型:

object x = new Int32[7];
Type t = x.GetType();
object y = Array.CreateInstance(t.GetElementType(), 7);
Run Code Online (Sandbox Code Playgroud)

或者,如果您可以直接获取元素的类型,请使用:

Type t = typeof(int);
object y = Array.CreateInstance(t, 7);
Run Code Online (Sandbox Code Playgroud)

基本上,Array.CreateInstance需要创建数组的元素类型,而不是最终的数组类型.


Bri*_*sen 40

只是为了补充Jon的答案.尝试1失败的原因是因为没有默认构造函数Int32[].你需要提供一个长度.如果你使用了一个带有一组参数的重载,它将起作用:

// attempt1 
object y1 = Activator.CreateInstance(t, new object[] { 1 }); // Length 1
Run Code Online (Sandbox Code Playgroud)

  • 这两个答案都让我脱离了泡菜,但我认为这是更优雅的方法.我不会猜到这个答案,但我看到有必要为数组的构造函数提供一个参数,因为数组的长度不是类型的一部分. (3认同)