12

我有一些数据类型为 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 时不喜欢它。请帮助我如何做到这一点。谢谢。

4

7 回答 7

31

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

select new
{
  //members selection
}

创建自定义类型

public class Result
{
    //Members declaration
}

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

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

方法看起来像

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

然后你会updategrid简单地调用updategrid(subquery1),你将拥有静态类型的元素序列的所有美感。updategrid

于 2013-01-11T15:28:53.167 回答
11
void updategrid(var queries)

不是有效的 C#。

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

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

同样,您不能在var没有赋值的情况下声明变量:

var something;

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

于 2013-01-11T15:29:25.197 回答
10

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

于 2013-01-11T15:28:39.070 回答
8

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

static void updategrid(dynamic queries)
{
} 

var意味着take type from right-hand side and declare variable with this type from left-hand side这是在编译时处理的。正如您所看到的,使用varas 方法参数类型没有任何意义。

于 2013-01-11T15:32:19.570 回答
5

使用Objectdynamic

void updategrid(object queries)

void updategrid(dynamic queries)

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

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

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

于 2013-01-11T15:33:14.703 回答
2

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

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

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

于 2013-01-11T15:30:41.557 回答
0

您可能可以使用动态引用,但我不会这样做。

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

例如:

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.
               };

并具有这样的功能:

public void updategrid(IEnumerable<MyColumns> queries)
{
}
于 2013-01-11T15:29:23.217 回答