C# 任何获取元组类型的方法<&燃气轮机;项目
def在哪里C# 任何获取元组类型的方法<&燃气轮机;项目,c#,.net,reflection,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)));
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
}
IEnumerable GetValues()
{
....
返回新元组(dataRow[“”].ToString(),
(双精度)Convert.ChangeType(dataRow[“”],typeof(双精度));
....
//以及更多基于其他自定义逻辑的类似于上面的代码
}
正如你所看到的,这是一个很大的铸造/强迫双倍
它仍然可以更改回字符串或其他数据类型
想知道是否有一种方法可以获得在签名中定义的元组的数据类型,这样我就可以创建一些通用的帮助程序,而不用担心在某些地方丢失一些转换
这应该是可能的反射?我希望如此 如果这是一个类,那么您可以为此调用一个很好的扩展方法
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>"));
....
}
IEnumerable GetValues(字符串字段1、字符串字段2)
{
....
返回新的元组(dataRow.Field(“”),
dataRow.Field(“”);
....
}
如果您有一个元组实例,您可以通过反射获得泛型类型参数:
var x = Tuple.Create<int, string>(0, "test");
var y = x.GetType().GetGenericArguments();
y[0].Name = "System.Int32";
var x=Tuple.Create(0,“test”);
变量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();
}
公共元组DoSomething()
{
var y=typeof(Tuple).GetGenericArguments();
var z=MethodBase.GetCurrentMethod().ReturnType.GetGenericArguments();
}
我不认为这真的会帮助你;您无法将在运行时获得的类型信息绑定到编译类型的泛型参数,因此不会节省大量工作。最后,您仍然需要在某个地方重复指定数据类型
Chris Shain的答案(字段方法)确实是解决问题的方法。不确定,但以下内容是否有帮助
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}");
boolbstringresult=false,bDoubleResult=false;
string sString=string.Empty;
双D双倍=0;
Tuple tTuple=Tuple.Create(sString,dDouble);
如果(tTuple.Item1.GetType()==typeof(string))bStringResult=true;
如果(tTuple.Item2.GetType()==typeof(double))bDoubleResult=true;
WriteLine($“字符串:{bStringResult},双精度:{bdoublesult}”);
结果:String:True,Double:True有没有办法像上面那样将元组实例从方法签名中删除?对不起,我的意思是如果有类似var y=GetTheReturnTypeOfThisMethod()的内容;传递一个
Nullable
而不是一个T,例如GetValues(…)