将类型’var’传递给C#中的方法

我有一些子查询,其数据类型为var。 这些正在开发数据表。 我想将这些传递给另一种方法,我该怎么做? 例如:

var subquery1= from results in table.AsEnumerable() where //some condition select new { column1=results.field1, column2 = results.field2 etc., } var subquery2= from results in table.AsEnumerable() where //different condition select new { column1=results.field1, column2 = results.field2 etc., } 

现在,我想定义一些方法将这些subquery1,subquery2作为变量传递。 例如:

 void updategrid(var queries) { //some logic } 

并执行方法:

 updategrid(subquery1); updategrid(subquery2); 

当我尝试在方法中使用var时,定义它并不喜欢它。 请帮我解决这个问题。 谢谢。

您的结果是一系列匿名对象。 var关键字只是对编译器说“嘿,从使用中推断出我的参数”。 从使用中推导出类型的过程称为类型推断 。 但是你不能说C#编译器在方法声明中推断出方法参数的类型。 此外,如果是anonymous objects ,则无法指定其名称。 所以你不应该在外面和其他方法中传递它们。 您可以将它们转换为dynamic ,然后通过CallSite访问其成员(编译器在您访问动态对象(如myDynamic.Name )的成员时创建它们),或者您可以将匿名对象转换为object并通过reflection访问其属性,但所有这些方法都是非C#惯用,真的很想念匿名对象。 而不是在查询中创建匿名对象

 select new { //members selection } 

创建自定义类型

 public class Result { //Members declaration } 

并将其实例化为查询的结果,如下例所示:(您可以替换var关键字而不是IEnumerable – 编译后的代码将是相同的)

 IEnumerable subquery1 = from results in table.AsEnumerable() where //some condition select new Result { //fill members here } 

方法看起来像

 void updategrid(IEnumerable queries) { //some logic here with strongly typed sequence } 

然后你将像updategrid(subquery1)一样调用updategrid ,你将在updategrid的主体中拥有所有元素的静态类型序列的美丽

Var不是数据类型。 这是“在编译应用程序时弄清楚这实际是什么数据类型”的简写。 您可以弄清楚数据类型实际是什么,并将其用于您的参数,或者您可以创建一个适用于任何数据类型的通用函数。

 void updategrid(var queries) 

是无效的C#。

var是语法糖 – 变量有一个类型,但如果编译器可以静态地确定它应该是什么,则不需要声明它。

使用参数,编译器没有足够的信息来确定类型。

同样,如果没有赋值,则无法使用var声明变量:

 var something; 

您需要确保subquery1subquery2的类型和updategrid的参数都是相同的。

您可以使用var类型的参数声明方法。 但你可以这样写:

 static void updategrid(dynamic queries) { } 

var表示take type from right-hand side and declare variable with this type from left-hand side并在编译时处理。 正如您所见,使用var作为方法参数类型毫无意义。

使用Objectdynamic

 void updategrid(object queries) void updategrid(dynamic queries) 

var – >由表达式右侧确定的静态类型。 不能用作参数/返回类型

object – >所有.NET类型的基类。

dynamic – >类型在运行时解析。 因此,不进行编译时检查,并且智能感知不可用。 它也有性能成本。

在C#中,没有’var’类型。 ‘var’只是一个关键字,它告诉编译器“分析旁边的任何内容以找出类型”。 这是在编译期间完成的,而不是运行时。

您所说的变量实际上是作为编译时编译器自动生成的匿名类型输入的。 这些类型由于没有名称,因此不能用于声明参数类型或返回值。

您应该为此数据创建显式类,或者在.Net4或更高版本中使用Tuple <>泛型类型。

你可以使用动态参考,但我不会那样做。

相反,更好的选择是为这些数据类型创建实际的类,并将它们传递给方法。

例如:

 public class MyColumns { public string column1 {get;set;} public string column1 {get;set;} //etc. } 

你可以这样创建:

 var subquery1= from results in table.AsEnumerable() where //some condition select new MyColumns { column1=results.field1, column2 = results.field2 //etc. }; 

并有这样的function:

 public void updategrid(IEnumerable queries) { }