Замена для .NET ArrayList.ToArray (Тип) в Silverlight - PullRequest
3 голосов
/ 05 ноября 2010

Ниже приведен простой метод, который я написал (чрезвычайно упрощенный, так что я надеюсь, что он все еще дает представление) для получения строкового представления элементов массива в строке и преобразования их в фактический массив этих значений.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. Любая помощь будет принята с благодарностью:)

  • Джеймс

1 Ответ

4 голосов
/ 05 ноября 2010

Не проверено, но я думаю, что это должно делать то, что вы хотите:

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; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...