代码之家  ›  专栏  ›  技术社区  ›  James

C 35;-替换Silverlight中的.NET ArrayList.ToArray(类型)

  •  3
  • James  · 技术社区  · 14 年前

    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或某物(不能使用type,因为访问级别是blah blah blah)。

    我在DeserializeArray()方法中尝试过执行类似aValues=Array.CreateInstance(t.GetElementType())的操作,但我不能使用[]来分配值,也不能将值分配给foreach(objects中的obj)。

    然后我尝试将avalUs参数更改为泛型对象[]数组,但在调用数组时,我得到了相同的转换(装箱/取消装箱)错误。

    所以,是的;我正试图为Silverlight4找到解决这个问题的方法。任何帮助都将不胜感激:)

    • 詹姆斯
    1 回复  |  直到 14 年前
        1
  •  4
  •   Michael Goldshteyn    14 年前

    没有测试,但我认为这应该符合你的要求:

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