以下是我编写的一个简单方法(极度简化,希望仍能传达要点),用于将数组元素的字符串表示形式转换为这些值的实际数组。t是数组的类型。
在.NET中这个很好用,但是在Silverlight中由于ArrayList对象被标记为Internal或其他一些访问级别的原因,所以不起作用(无法使用类型,因为访问级别等等)。
因此,我正在寻找替代ArrayList.ToArray(Type)的方法。我不能只使用List.ToArray(),因为PropertyInfo.SetValue()调用将试图将一个object[]转换成Int32[]或类似的类型,从而导致错误。
我尝试在DeserializeArray()方法中做一些像aValues = Array.CreateInstance(t.GetElementType())的事情,但我不能使用[]来分配值,也不能对foreach(obj in objects)进行赋值。
然后我尝试将aValues参数更改为通用的object[]数组,但是当调用Array.CreateInstance()时,在运行时仍会出现相同的转换(装箱/拆箱)错误。
所以,是的,我正在尝试为Silverlight 4找到解决此问题的方法。任何帮助都将不胜感激 :)
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对象被标记为Internal或其他一些访问级别的原因,所以不起作用(无法使用类型,因为访问级别等等)。
因此,我正在寻找替代ArrayList.ToArray(Type)的方法。我不能只使用List.ToArray(),因为PropertyInfo.SetValue()调用将试图将一个object[]转换成Int32[]或类似的类型,从而导致错误。
我尝试在DeserializeArray()方法中做一些像aValues = Array.CreateInstance(t.GetElementType())的事情,但我不能使用[]来分配值,也不能对foreach(obj in objects)进行赋值。
然后我尝试将aValues参数更改为通用的object[]数组,但是当调用Array.CreateInstance()时,在运行时仍会出现相同的转换(装箱/拆箱)错误。
所以,是的,我正在尝试为Silverlight 4找到解决此问题的方法。任何帮助都将不胜感激 :)
- 詹姆斯