任何获得元组类型的方法<>项)

时间:2012-02-29 16:01:01

标签: c# .net reflection

def是

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

}

正如你所看到的那样,很多演员/强制加倍 它可能仍会更改回字符串或其他数据类型

想知道是否有办法在签名中定义Tuple的数据类型,这样我就可以创建一些通用帮助器而不用担心在某处丢失某些转换

反射应该可以吗?我希望!

3 个答案:

答案 0 :(得分:5)

如果这是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>"));
   ....
}

答案 1 :(得分:2)

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

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>方法)真的是要走的路。

答案 2 :(得分:0)

不确定,但是下面的内容对您有帮助吗?

bool bStringResult = false, bDoubleResult = false;
string sString = string.Empty;
double dDouble = 0;

Tuple<string, double> tTuple = Tuple.Create(sString, dDouble);

if (tTuple.Item1.GetType() == typeof(string)) bStringResult = true;
if (tTuple.Item2.GetType() == typeof(double)) bDoubleResult = true;

Console.WriteLine($"String: {bStringResult}, Double: {bDoubleResult}");

结果:字符串:真,双精度:真