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

svs*_*svs 10 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.,
               }
Run Code Online (Sandbox Code Playgroud)

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

void updategrid(var queries)
          {
          //some logic
           }
Run Code Online (Sandbox Code Playgroud)

并执行方法:

updategrid(subquery1);
updategrid(subquery2);
Run Code Online (Sandbox Code Playgroud)

当我尝试在方法中使用var时,定义它并不喜欢它.请帮我说明怎么做.谢谢.

Ily*_*nov 30

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

select new
{
  //members selection
}
Run Code Online (Sandbox Code Playgroud)

创建自定义类型

public class Result
{
    //Members declaration
}
Run Code Online (Sandbox Code Playgroud)

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

IEnumerable<Result> subquery1 = from results in table.AsEnumerable()
                                where //some condition
                                select new Result
                                {
                                     //fill members here
                                }
Run Code Online (Sandbox Code Playgroud)

方法看起来像

void updategrid(IEnumerable<Result> queries)
{
    //some logic here with strongly typed sequence
}
Run Code Online (Sandbox Code Playgroud)

然后你就会updategrid像简单地一样打电话updategrid(subquery1),你将拥有所有元素的静态类型序列的美丽updategrid


Ode*_*ded 10

void updategrid(var queries)
Run Code Online (Sandbox Code Playgroud)

是无效的C#.

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

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

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

var something;
Run Code Online (Sandbox Code Playgroud)

您将需要确保的类型subquery1,subquery2以及参数updategrid都是一样的.


小智 9

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


Ale*_*lte 8

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

static void updategrid(dynamic queries)
{
} 
Run Code Online (Sandbox Code Playgroud)

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


Til*_*lak 7

使用Objectdynamic

void updategrid(object queries)

void updategrid(dynamic queries)
Run Code Online (Sandbox Code Playgroud)

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

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

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