我有一些子查询,其数据类型为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都是一样的.
您可以使用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作为方法参数类型毫无意义.
使用Object或dynamic
void updategrid(object queries)
void updategrid(dynamic queries)
Run Code Online (Sandbox Code Playgroud)
var-> 由表达式右侧确定的静态类型。不能用作参数/返回类型
object-> 所有 .NET 类型的基类。
dynamic-> 类型在运行时解析。因此,不会进行编译时检查,并且智能感知不可用。它还具有性能成本。