Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任何获取元组类型的方法<&燃气轮机;项目_C#_.net_Reflection - Fatal编程技术网

C# 任何获取元组类型的方法<&燃气轮机;项目

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)));

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

}
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(…)