gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:07:58 27 4
gpt4 key购买 nike

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

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

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

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

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

有什么想法吗?

最佳答案

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

一种选择是调用 Cast (然后是 ToArray )使用反射。老实说,将所有内容放入一个通用方法中并通过反射调用 that 可能是最简单的方法:

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

关于c# - Convert.ChangeType 生成具体类型元素数组,而不是对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6093789/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com