代码之家  ›  专栏  ›  技术社区  ›  Mark Lakata

如何使用反射和类型信息创建C#数组[[副本]

  •  35
  • Mark Lakata  · 技术社区  · 14 年前

    我不知道该怎么做:

    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
    

    秘方是什么?如果我能得到数组元素的类型,我可以让第二个工作,但我也没有弄清楚那个。

    2 回复  |  直到 14 年前
        1
  •  49
  •   Brian Rasmussen    14 年前

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

    // attempt1 
    object y1 = Activator.CreateInstance(t, new object[] { 1 }); // Length 1
    
        2
  •  67
  •   Jon Skeet    14 年前

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

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

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

    Type t = typeof(int);
    object y = Array.CreateInstance(t, 7);
    

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