2010-11-05 59 views
3

下面是我寫的一個簡單方法(非常簡化,所以我希望它仍然可以跨越jist)獲取字符串中數組元素的字符串表示形式,並將它們轉換爲這些值的實際數組。 t是數組的類型。C# - 在Silverlight中替換.NET ArrayList.ToArray(Type)

DeserializeArray(string sArrayElements, out Array aValues, Type t) 
{ 
    string[] sValues = ProcessArrayElements(sArrayAsString); 
    ArrayList alValues = new ArrayList(sValues.Length); 
    for(int i = 0; i < sValues.Length; ++i) 
     alValues.Add(ProcessValue(sValues[ i ])); 
    aValues = alValues.ToArray(t.GetElementType()); 
    return true; 
} 

然後我會用下面的代碼使用這個方法。 propertyInfo是在這種情況下.IsArray()== true的對象的屬性。 sArrayElements只是包含數組(「VAL1,VAL2,...,VALN」)的字符串表示字符串

Array aValues; 
if (DeserializeArray(sArrayElements, out aValues, propertyInfo.PropertyType)) 
    propertyInfo.SetValue(oObject, aValues, null); 
else 
    throw new FormatException("Unable to parse Array Elements: " + sArrayElements); 

這精美的作品在.NET中,但不是在Silverlight,因爲ArrayList對象標記作爲內部或東西(不能使用類型,因爲訪問級別等等等等等等等)。

所以我正在尋找替代ArrayList.ToArray(類型)。我不能僅僅使用列表<對象> .ToArray(),因爲PropertyInfo.SetValue()調用會嘗試將對象[]設置爲Int32 []或類似內容。我曾嘗試在DeserializeArray()方法做類似aValues = Array.CreateInstance(t.GetElementType())但我不能使用[]來分配值,你不能分配值的foreach() obj在對象中)。

然後,我試着將aValues參數更改爲通用對象[]數組,但在調用Array.CreateInstance()時,運行時出現了相同的轉換(裝箱/取消裝箱)錯誤。

所以是的;我試圖找到一個解決這個問題的Silverlight 4,任何幫助,將不勝感激:)

  • 詹姆斯

回答

4

沒有測試,但我認爲這應該做你想要什麼:

DeserializeArray(string sArrayElements, out Array aValues, Type t) 
{ 
    string[] sValues = ProcessArrayElements(sArrayAsString); 
    aValues = new Array[sValues.Length]; 
    for(int i = 0; i < sValues.Length; ++i) 
     aValues.SetValue(Activator.CreateInstance(t,ProcessValue(sValues[i])),i); 

    return true; 
} 
+0

這引出我的回答,非常感謝!我必須改變'aValues = new Array [sValues.Length]爲aValues = Array.CreateInstance(t.GetElementType(),sValues.Length);在對象,字符串和整數上調用SetValue()沒有問題。謝謝! – James 2010-11-05 16:53:48