【发布时间】: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