簡體   English   中英

Convert.ChangeType生成具體類型元素的數組,而不是對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM