【问题标题】:Cast Object[] to Type[] via Reflection通过反射将 Object[] 转换为 Type[]
【发布时间】:2012-07-28 00:22:46
【问题描述】:

目标

我有一个 object[]Source、object Target 和 FieldInfo Var(Var.FieldType.IsArray 为 true)。 我想运行 Var.SetValue(Target,Source)。 但是,我无法转换“object[]”->“anotherType[]”

样本运行

object[]Source=new object[2]{"Hello","World"};
Var.SetValue(Target,Source); //Cannot Convert "object[]"->"string[]"

[注意:我希望能够使用 int、double、float 等。否则,这个问题将非常简单]

研究

使用变量: 无法使用,因为无法创建 var 数组

使用泛型:

这适用于

myField.SetValue(target,GenericCastArray<string>(source));

但是,它不适用于

Type someType=typeof(string); //or int, or float
 (myfield.SetValue(target,GenericCastArray< someType > (source))

* http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/fe14d396-bc35-4f98-851d-ce3c8663cd79/* 返回空引用异常,我认为在 this.GetType()

编辑:Meh 解决方案 基于 cmets,不可能从 object[] 转换为 string[]。 但是,以下代码运行良好。

object[]Source=null;
Type basetype=Var.FieldType.GetElementType();
int l=somelength;
if (basetype.IsEquivalentTo(typeof(string))) Source = new string[l];
//repeat for all types

source=//run your Reflection here

var.SetValue(target,source); 

【问题讨论】:

  • 有什么理由来源需要是对象[]?有没有办法使源代码通用,因此不需要进行强制转换?你能解释一下你用的是什么吗?你可以在泛型类中进行泛型转换,所以它可能就是你想要的......
  • 坦率地说,您尝试做的事情是行不通的。如果您在编译时对类型有足够的了解,则只能使用泛型。在运行时(通过someType)之前,您显然不知道您得到了什么类型。
  • @Charleh 我正在尝试使用反射来序列化字符串/整数/双精度/等数组。感谢有关使 Source 通用的建议,尽管我对如何做到这一点有点困惑。我会研究这个。
  • SetValue() 的签名是什么?你可以在这里使用反射,但那是完全不同的野兽。
  • 您能否详细说明一下,也许可以发布您要序列化的内容,为什么要这样做,要序列化的对象是什么,要反序列化的对象是什么,也许放一些的代码。通常对这样的事情使用反射意味着你可能没有以正确的方式去做

标签: c# arrays generics reflection setvalue


【解决方案1】:

不可能将一种类型的数组转换为另一种类型的数组(即object[]string[]),因为它们是不同的不兼容类型。反射也无助于投射。

要进行转换,您始终需要直接创建数组的某种副本,或者通过 LINQ 转换函数之一创建 IEnumerable&lt;DestinationType&gt;

【讨论】:

  • 嗯,没那么简单。你可以投射例如string[]object[] 感谢数组协方差。 (尽管数组协方差是个坏主意,而 .Net 拥有它只是因为它想与 Java 兼容。)
  • ... 并且数组协方差仅适用于引用类型的数组。它根本不适用于值类型的数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 2012-01-18
  • 1970-01-01
相关资源
最近更新 更多