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的数据类型,这样我就可以创建一些通用帮助器而不用担心在某处丢失某些转换
反射应该可以吗?我希望!
答案 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}");
结果:字符串:真,双精度:真