C# - Silverlight中替代.NET ArrayList.ToArray(Type)的方法

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

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; 
}

这让我找到了答案,非常感谢!我所需要改变的只是将'aValues = new Array[sValues.Length]' 改为 'aValues = Array.CreateInstance(t.GetElementType(), sValues.Length);',然后就可以在对象、字符串和整数上调用SetValue()方法了。谢谢! - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接