【问题标题】:C# - Replacement for.NET ArrayList.ToArray(Type) in SilverlightC# - Silverlight 中 .NET ArrayList.ToArray(Type) 的替换
【发布时间】:2011-05-05 16:43:15
【问题描述】:

下面是我写的一个简单的方法(非常简化,所以我希望它仍然可以理解),用于获取字符串中数组元素的字符串表示,并将它们转换为这些值的实际数组。 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在对象中)。

然后我尝试将 aValues 参数更改为通用对象 [] 数组,但在运行时调用 Array.CreateInstance() 时出现相同的转换(装箱/拆箱)错误。

是的;我正在尝试为 Silverlight 4 找到此问题的解决方案。任何帮助将不胜感激:)

  • 詹姆斯

【问题讨论】:

    标签: c# silverlight arraylist


    【解决方案1】:

    未经测试,但我认为这应该可以满足您的要求:

    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() 没有问题。谢谢!
    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2012-04-10
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多