Convert.ChangeType产生具体类型元素而不是对象的数组

Sch*_*999 3 .net c# linq type-conversion

遇到以下问题。我有一个属性,用于定义数据库表中键的名称。使用反射,我可以初始化属性或具有该属性的字段的值。在我将属性定义为数组之前,一切都很好:

[ConfigurationKey("TestArray")]
public int[] Array { get; set; }
Run Code Online (Sandbox Code Playgroud)

假设表中存储的值是逗号分隔的字符串,我将使用以下内容创建一个数组:

return valueString.Split(',').Select(s => Convert.ChangeType(s, memberType.GetElementType())).ToArray();
Run Code Online (Sandbox Code Playgroud)

这确实创建了一个元素数组,但仅创建了对象数组。结果,当我使用FieldInfo或PropertyInfo设置值时,会抛出异常“无法分配Object[]Int32[]”。

有任何想法吗?

Jon*_*eet 5

鉴于Convert.ChangeType已声明要返回Object,所以我认为这并不是特别令人惊讶。ToArray()将创建一个与输入序列具有相同元素类型的数组,在这种情况下Select将返回一个IEnumerable<object>

一种选择是使用反射调用Cast(然后调用ToArray)。说实话,它可能会是最容易把一切都变成一个通用的方法,并调用反射:

public static T[] ParseToArray<T>(string valueString)
{
    return valueString.Split(',')
                      .Select(s => (T) Convert.ChangeType(s, typeof(T))
                      .ToArray();
}
Run Code Online (Sandbox Code Playgroud)

然后,您需要:

Type t = memberType.GetElementType();
// Use the type declaring ParseToArray here
MethodInfo methodDefinition = typeof(...).GetMethod("ParseToArray");
MethodInfo method = methodDefinition.MakeGenericMethod(t);
object array = method.Invoke(null, new object[] { valueString });
Run Code Online (Sandbox Code Playgroud)