如果我能让对象进行数组转换,那真的很好。
步骤:
对于初学者来说,这很好用
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
答案 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[,,]
。
再次感谢。