[英]Convert.ChangeType to produce an array of concrete type elements, not objects
掙扎着以下問題。 我有一個屬性,用於定義數據庫表中鍵的名稱。 使用反射,我使用該屬性初始化屬性或字段的值。 在將我的屬性定義為數組之前,一切都很棒:
[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
)。 說實話,將所有內容放入一個通用方法中可能最簡單,並通過反射調用它 :
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 });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.