C# 在C中声明匿名类型的列表变量

C# 在C中声明匿名类型的列表变量,c#,asp.net,linq-to-sql,anonymous-types,C#,Asp.net,Linq To Sql,Anonymous Types,我正在使用ASP.NET4和C使用LINQtoSQL。我已经创建了一个LINQ查询,它将生成一个新的列表,即ToList。返回的列表是匿名类型,因为它是由查询动态创建的。我希望能够在代码隐藏的页面级别声明一个变量,这样我就可以在其他函数中使用它,也可以在头版使用它 VisualStudio告诉我结果是匿名类型,但给了我类名,例如:{CLASS1,CLASS2} 如何声明此匿名类型的变量?您必须为结果声明一个类型,因为据我所知,无法直接声明匿名类型的实例。即使将其存储在值中,也无法在创建它的范围之

我正在使用ASP.NET4和C使用LINQtoSQL。我已经创建了一个LINQ查询,它将生成一个新的列表,即ToList。返回的列表是匿名类型,因为它是由查询动态创建的。我希望能够在代码隐藏的页面级别声明一个变量,这样我就可以在其他函数中使用它,也可以在头版使用它

VisualStudio告诉我结果是匿名类型,但给了我类名,例如:{CLASS1,CLASS2}


如何声明此匿名类型的变量?

您必须为结果声明一个类型,因为据我所知,无法直接声明匿名类型的实例。即使将其存储在值中,也无法在创建它的范围之外使用它


您可以使用反射获取值,并将变量声明为IList类型,但这比创建新类型要复杂得多。

匿名类型本身就无法显式声明。他们是匿名的,不知名的;您没有要声明的类型。因此,匿名类型,无论是直接的还是作为泛型类型参数,都不能指定为参数、用作返回类型或存储到任何显式类型的变量。您必须使用var来分配它们,这意味着您几乎只能在本地范围内使用该类型

基本上,您唯一的选择是将匿名类型转换为可以显式声明的收集类型,即必须声明类型本身。只需创建一个简单的DTO类,在调用ToList之前,通过使用匿名类型初始化强类的Select Linq节点运行匿名类型

如果您使用的是.NET4.0,则可以使用动态。dynamic关键字,以及通过参数或返回类型声明为dynamic的任何对象,基本上告诉编译器不要尝试验证对其执行的任何操作;您可以尝试使用任何运算符、调用任何方法等。但是,如果运算符、成员或您正在执行的任何其他操作对于对象在幕后的实际情况无效,您将获得运行时异常,您必须非常稳健地处理这些异常。由于这个原因,.NET4.0的动态特性不能轻易使用

正如Kratz所说,您唯一可以做的另一件事是返回ArrayList或Object[]数组,并使用反射来发现匿名类型的结构。这是一个不,几乎没有任何方式,你切片;你失去了集合的强类型,你的代码膨胀得很厉害,因为你需要几行代码来执行最简单的get或set操作,反射,同样是它的本质,可以比已知静态类型上的等效操作慢100倍。

您可以创建一个列表,并在代码中测试该类型,如:

if(myList[index].GetType() == typeof(Class1))
{
   //put your code for class1
}
else if(myList[index].GetType() == typeof(Class2))
{
   //put your code for class2
}

如果您不打算立即使用一个查询的结果,该查询会吐出一系列匿名类型,那么您应该强烈地考虑声明一个实际类型来存储DATA.DLV是正确的。匿名类型实际上不是设计用来传递的。你最好声明一个实际的类型虽然,正如大家所指出的,你试图做的是滥用匿名类型,但从技术上讲,有一种方法可以避免。我知道从LINQ查询返回的类名可能重复,我如何使用它例如,我不能创建包含两个参数的列表?!您必须创建一个具有Class2和Class1类型的两个属性的新类,然后给它一个简单的构造函数。在linq查询中,是否选择新的Class3obj1、obj2,并给出列表类型列表我如何从返回的匿名类型列表转换到函数中的列表,以便除了匿名类型列表之外,还可以列出myvar?不能,必须在linq中选择特定类型。如果选择多个选项,如选择x.Name、x.Value,则返回匿名类型。如果选择x.Name,将返回非匿名类型。因此,如果您选择新的Class3x.obj1,x.obj2,您只选择了一种类型,因此您的列表将是真实类型,而不是匿名类型。是否有选项将“var”声明为类级变量var保存从LINQ to SQL查询返回的数据?虽然您在技术上是正确的,但我绝不建议这样做,这是一个肮脏的解决方案,您最好只创建一个简单的类。