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)
答案 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[]
)