C# 设置没有泛型转换的数组 memberInfo
C# Set array memberInfo without generic cast
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))
没有任何意义,因为它仍然是 returns object[]
并且我的自定义转换器已经将输入元素转换为正确的元素类型!!只是数组本身被包装了。有没有办法做 object array = SomeFunc(Type arrayType, object[] elements);
这样的 hack?
如何设置数组字段成功?
(我希望我说清楚了:P)
哦,我想我明白了!这是解决方案:
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[]
)
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))
没有任何意义,因为它仍然是 returns object[]
并且我的自定义转换器已经将输入元素转换为正确的元素类型!!只是数组本身被包装了。有没有办法做 object array = SomeFunc(Type arrayType, object[] elements);
这样的 hack?
如何设置数组字段成功? (我希望我说清楚了:P)
哦,我想我明白了!这是解决方案:
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[]
)