下面是我编写的一个简单方法(非常简化,因此我希望它仍然可以得到jist),用于在字符串中获取数组元素的字符串表示形式,并将它们转换为这些值的实际数组。 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对象被标记为Internal或者其他东西(因为访问级别等等而无法使用类型)。
所以我正在寻找ArrayList.ToArray(Type)的替代品。我不能只使用List&lt; object&gt; .ToArray(),因为PropertyInfo.SetValue()调用会试图将object []变成Int32 []等。
我已经尝试在DeserializeArray()方法中执行类似aValues = Array.CreateInstance(t.GetElementType())的操作,但是我不能使用[]来分配值,并且您无法为foreach赋值(obj在对象中。)
然后我尝试将aValues参数更改为通用对象[]数组,但在调用Array.CreateInstance()时,我在运行时获得了相同的转换(装箱/拆箱)错误。
是的,是的我正在尝试为Silverlight 4找到解决此问题的方法。任何帮助都将非常感谢:)答案 0 :(得分: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;
}