C#设置数组memberInfo而不进行通用转换

时间:2015-06-28 16:40:01

标签: c# generics reflection

if(fieldInfo.FieldType.IsArray)
{
    Type elementType = fieldInfo.FieldType.GetElementType();
    obj[] objs = MyCustomConverter.Convert(elementType, IEnumerable<string> input);
    field.SetValue(target,objs);
}

SetValue步骤将引发异常,因为要设置的值(objs)与特定类型不匹配。但最困难的部分是我不知道数组究竟是什么类型。我所拥有的只是非通用的。 所以我不能打电话给Cast<T>(我没有那个通用T,但我有typeof(T))。并且Array.ConvertAll(objs,obj=> Convert.ChangeType(obj, elementType))没有任何意义,因为它仍然返回object[]并且我的自定义转换器已经将输入元素转换为正确的元素类型!!只是阵列本身被包裹了。有没有办法像object array = SomeFunc(Type arrayType, object[] elements);那样进行黑客攻击?

如何成功设置阵列字段? (我希望我明确表示:P)

1 个答案:

答案 0 :(得分:0)

哦,我想我想通了!这是解决方案:

object[] array = obj[] objs = MyCustomConverter.Convert(elementType, IEnumerable<string> input);
Array wrappedArray = Array.CreateInstance(elementType, array.Length);
array.CopyTo(wrappedArray, 0);
field.SetValue(target,wrappedArray);

只是因为我不知道Array.CreateInstance而不是T[]创建的数组(如int[]