C#将数组类型的对象转换为T,其中T是一个数组?

时间:2011-03-30 10:13:53

标签: c# arrays generics casting

如果我能让对象进行数组转换,那真的很好。

步骤:

  1. 我们从外部源传递数组。数组装在一个对象中。通常,对象是int []或double [],但我们通常需要double []。
  2. 将其转换为Type T的数组。
  3. 返回转换后的类型。
  4. 对于初学者来说,这很好用

    double[] r=Array.ConvertAll<int,double>((int[])o,Convert.ToDouble)
    

    但这不是(假设T是“双”),例如double [] R = getValue(o);

    public T[] getValue<T>(object o){
    // ... some logic...
    return (T[])Array.ConvertAll<int,double>((int[])o,Convert.ToDouble)
    

    是否存在可以使用的约束? Array是一个“特殊对象”,因此我们不能将其用作约束。

    这可能在.net中没有诉诸IL吗?是否可以诉诸IL?

    感谢, -Steven

4 个答案:

答案 0 :(得分:3)

这对我有用:

public T[] GetValue<T>(object o)
{
        Converter<int, T> c = new Converter<int, T>(input => (T)System.Convert.ChangeType(input, typeof(T)));
        return (T[])Array.ConvertAll<int, T>((int[])o, c);
}

我希望这有帮助!

答案 1 :(得分:1)

试试这个:

public T[] getValue<T>(object o)
{
    return (T[])Convert.ChangeType(o, typeof(T[]));
}

像这样使用:

object doubleArr = new Double[] {1.3, 1.5, 1.7};
var returnedValue = getValue<double>(doubleArr);

请注意,如果您为模板传入了错误的类型,它将在运行时失败

答案 2 :(得分:0)

- 删除了之前的内容

抱歉,我没有看到当然无法编译的Convert.ToDouble。为了能够处理任何类型的T,您必须将转换回调传递给getValue

这样的事情应该可以胜任:

public T[] getValue<T>(object o, Converter<int, T> converter)
{
    // ... some logic...
    return (T[])Array.ConvertAll<int,T>((int[])o, converter)
}

用法:

double[] result = getValue<double>(o, (i) => Convert.ToDouble(i));

答案 3 :(得分:0)

以上所有三个答案都有效。真棒。非常感谢。

一个问题:来自呼叫者的Convert.ToDouble上面的符号变为(i) => Convert.ToDouble(i)。符号是否等效?

我是新来的......我应该以某种方式接受答案吗?不知道我能否,因为当我发布问题时我没有注册。

在上述答案的扩展中,我得到了这个非常简洁的解决方案:

public T[,,] getValue_3d<T>(object o) {
    return (T[,,])Convert.ChangeType(o,typeof(T[,,]));
}

用法:

object doubleArr=new Double[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, 
                                  { { 7, 8, 9 }, { 10, 11, 12 } } };
double[,,] returnedValue=getValue_3d<double>(doubleArr);

我最初尝试过的一件事就是让T(其中T是一个n级数组),获取元素类型,然后进行转换。当从函数返回值时,它不能很好地工作。

为了更加巧妙地做到这一点,如果我们可以使用函数返回值进行重载,那就太好了......但据我所知,这在C#设计中是不可能的。也许还有另外一招。还尝试了TIn + TOut无效(TIn为双倍,而TOut为double[] / double[,] / double[,,]

再次感谢。