2011-03-30 40 views
2

如果我能得到一个对象到数组的转换工作,这将是非常好的。C#将数组类型的对象转换为T,其中T是数组?

步骤:

  1. 我们获得通过从外部源的数组。该数组装在一个对象中。通常对象是一个int []或double [],但我们通常需要double []。
  2. 将其转换为T型数组。
  3. 返回转换后的类型。

对于初学者来说,这工作正常

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) 

是否有可以使用的where约束?数组是一个“特殊对象”,所以我们不能用它作为约束。

这是可能的.net而不诉诸IL?我们是否可以诉诸IL?

感谢, -Steven

+0

你是什么意思“诉诸IL”吗?你打算编写自定义的IL代码要解决这个问题? – 2011-03-30 10:17:45

回答

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)); 
+0

也不行,函数不会编译。问题是因为T可以是_anything_,而不是所有的东西都可以从double [] – Rob 2011-03-30 10:23:33

+0

@Rob转换:虽然不是所有东西都可以转换为一个double类型的'Convert'类确实提供了一个需要'int'的重载,所以上面的代码将会被编译(也有一个重载需要'object',所以可以修改泛型函数来获取' object'而不是'int' - 这会增加可能性在示例用法中转换时出现运行时错误。) – 2011-03-30 10:33:50

+0

我的评论是在编辑前 – Rob 2011-03-30 11:18:51

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

这为我工作失败:

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

我希望这有助于!

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-rank数组),获取元素类型,然后进行转换。从函数返回值时,它并不能很好地工作。

要做到这一点更加整齐,如果我们可以使用函数返回值进行重载,那么会很好......但据我所知,这在C#中是不可能的。也许还有一个窍门。也试过锡+吹捧无济于事(锡双,而吹捧为double[]/double[,]/double[,,]再次

感谢。

相关问题