Ниже приведен простой метод, который я написал (чрезвычайно упрощенный, так что я надеюсь, что он все еще дает представление) для получения строкового представления элементов массива в строке и преобразования их в фактический массив этих значений.t является типом массива.
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 (Type).Я не могу просто использовать List .ToArray (), потому что при вызове PropertyInfo.SetValue () будет пытаться превратить объект [] в Int32 [] или подобное.
Я пыталсяв методе DeserializeArray () сделать что-то вроде aValues = Array.CreateInstance (t.GetElementType ()), но я не могу использовать [] для присвоения значений, и вы не можете назначать значения foreach (obj в объектах).
Затем я попытался изменить параметр aValues на универсальный массив object [], но я получаю те же ошибки преобразования (упаковки / распаковки) во время выполнения при вызове Array.CreateInstance ().
Так что да;Я пытаюсь найти решение этой проблемы для Silverlight 4. Любая помощь будет принята с благодарностью:)