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

时间:2011-05-23 06:50:46

标签: c# .net linq type-conversion

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

[ConfigurationKey("TestArray")]
public int[] Array { get; set; }

假设表中存储的值是逗号分隔的字符串,我使用以下命令创建数组:

return valueString.Split(',').Select(s => Convert.ChangeType(s, memberType.GetElementType())).ToArray();

这会创建一个元素数组,但只创建一个对象数组。因此,当我使用FieldInfo或PropertyInfo设置值时,它会抛出“无法将Object[]分配给Int32[]”的异常。

有什么想法吗?

1 个答案:

答案 0 :(得分: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();
}

然后你需要:

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 });