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[]”。
有任何想法吗?
鉴于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)
| 归档时间: |
|
| 查看次数: |
2943 次 |
| 最近记录: |