任何方式来获得元组的类型<>项目(S)

问题描述:

其中DEF是任何方式来获得元组的类型<>项目(S)

IEnumerable<Tuple<string, double>> GetValues() 
{ 
    .... 
     yield return new Tuple<string,double>(dataRow["<field>"].ToString(), 
       (double)Convert.ChangeType(dataRow["<field>"], typeof(double))); 
    .... 

    // and more code similar to above based on other custom logic 

} 

,你可以看到,山很多铸造/ coerc'ng的一倍 它仍然可以改变。返回字符串或其它数据类型

不知道是否有一种方式来获得在签名定义元组的数据类型,所以我可以创造出一些通用的帮手,而不是担心错过一些转化某处

应该可以与反思?我希望 !

如果这是DataRow类,那么对此有一个很好的扩展方法Field

IEnumerable<Tuple<T1, T2>> GetValues<T1, T2>(String field1, String field2) 
{ 
    .... 
     yield return new Tuple<T1,T2>(dataRow.Field<T1>("<field>"), 
       dataRow.Field<T2>("<field>")); 
    .... 
} 
+0

看起来不错,任何干净的方式来处理DBNULL,以及? – Kumar 2012-03-01 14:44:05

+0

通过'Nullable '而不是T,例如'GetValues (...)' – 2012-03-01 14:46:18

如果你有元组的一个实例,你可以通过反射得到泛型类型参数:

var x = Tuple.Create<int, string>(0, "test"); 
var y = x.GetType().GetGenericArguments(); 
y[0].Name = "System.Int32"; 

您可以使用“typeof运算()”获得在编译时相同的信息,或在运行时使用反射,像这样:

public Tuple<string, double> DoSomething() 
{ 
    var y = typeof(Tuple<string, double>).GetGenericArguments(); 
    var z = MethodBase.GetCurrentMethod().ReturnType.GetGenericArguments(); 
} 

我不认为这真的会帮助你;你不能将运行时获得的类型信息绑定到编译类型的泛型参数上,这样你就不会节省大量的工作。您仍然最终不得不在某处重复指定数据类型。

Chris Shain的答案(Field<T>方法)真的是要走到这里的路。

+0

以任何方式将元组实例从方法签名中取出,如上所示? – Kumar 2012-03-01 14:42:49

+0

是的,使用typeof()。我会更新我的答案。 – 2012-03-01 14:57:34

+0

对不起,我的意思是如果沿着var y = GetTheReturnTypeOfThisMethod(); – Kumar 2012-03-01 20:42:00