微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Convert.ChangeType产生一个具体类型的元素数组,而不是对象

|| 遇到以下问题。我有一个属性,用于定义数据库表中键的名称。使用反射,我可以初始化属性或具有该属性的字段的值。在将我的属性定义为数组之前,一切都很好。
[ConfigurationKey(\"TestArray\")]
public int[] Array { get; set; }
假设表中存储的值是逗号分隔的字符串,那么我将使用以下内容创建一个数组:
return valueString.Split(\',\').Select(s => Convert.ChangeType(s,memberType.GetElementType())).ToArray();
这确实创建了一个元素数组,但仅创建了对象数组。结果,当我使用FieldInfo或PropertyInfo设置值时,它抛出异常“无法将
Object[]
分配给
Int32[]
\”。 有任何想法吗?     

解决方法

好吧,既然声明了ѭ4to将返回
Object
,我认为这并不是特别令人惊讶。
ToArray()
将创建一个与输入序列具有相同元素类型的数组,在这种情况下ѭ7将返回return8。 一种选择是使用反射调用
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 });
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。