【问题标题】:How do I create a C# array using Reflection and only type info? [duplicate]如何使用反射创建 C# 数组并且只输入信息? [复制]
【发布时间】:2010-08-05 21:46: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

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

【问题讨论】:

  • 你让我在“秘密酱汁”。 =)

标签: c# arrays reflection constructor


【解决方案1】:

你需要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需要数组的元素类型来创建,而不是最终的数组类型。

【讨论】:

  • 这并不能解释为什么它不能与 //attempt1 一起使用,我对自己很好奇(鉴于 //attempt2 有效)。
  • 在我发布我的问题几秒钟后,我发现了 GetElementType(),这就是我实现它的方式。我的目标是制作一个 TreeView 派生的小部件,它可以让你向它抛出任何结构(带有任意字段,包括数组、原语和更多结构),并显示整个东西,让你编辑它并给你一个编辑过的结构的副本.
  • Array.CreateInstance 返回 Array 类型的对象,而不是例如int[]。给定一个类型变量Type t = typeof(int);,是否可以创建int[]类型的对象?
  • @NetMage:它确实创建了一个int[],你只需要转换:int[] x = (int[]) Array.CreateInstance(typeof(int), 10);
  • 我无法投射,我在运行时只有t。背景:我正在尝试动态创建一个值类型,以在 Func /Action 对中用作我可以读取和分配的变量。我试图通过创建例如作弊。 a = new int[1]() 和读/写a[0]。我试图避免在我的Func/Action 对中添加Expression.Convert 以将Array 转换为int[]。也许我会添加一些单独的问题。
【解决方案2】:

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

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

【讨论】:

  • 这两个答案都让我摆脱困境,但我认为这是更优雅的方法。我不会猜到这个答案,但我知道有必要为数组的构造函数提供参数,因为数组的长度不是类型的一部分。
  • 刚刚使用这个和来自stackoverflow.com/a/20052747/561690 的块来启用处理数组的深度复制实现 - 可能不是最好的方法,但它对我有用!谢谢!
  • 更简单:Activator.CreateInstance(t, 1)
  • 谁能给我一个为数组创建实例而不提及数组长度的例子
猜你喜欢
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 2017-03-13
相关资源
最近更新 更多