在c#中声明匿名类型的LIST变量

本文关键字:类型 LIST 变量 声明 | 更新日期: 2023-09-27 18:05:13

我正在使用LINQ到SQL与ASP。NET 4和c#。我已经创建了一个LINQ查询,结果在一个新的列表(即。ToList())。返回的LIST是匿名类型,因为它是由查询动态创建的。我希望能够在代码后面的页面级别声明一个变量,这样我就可以在其他函数中使用它,也可以在首页上使用'<%= %>'。

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

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

在c#中声明匿名类型的LIST变量

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

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

如果你使用的是。net 4.0,你可以选择dynamicdynamic关键字,以及任何通过声明为dynamic的参数或返回类型传递的对象,基本上告诉编译器不要试图验证对其执行的任何操作;您可以尝试使用任何操作符,调用任何方法等。然而,如果你执行的操作符、成员或任何其他操作对对象在幕后的实际作用无效,你就会得到运行时异常,你必须非常健壮地处理它。因此,不能轻易使用。net 4.0的dynamic特性。

正如Kratz所说,你唯一能做的就是返回一个ArrayList,或者Object[]数组,并使用反射来发现匿名类型的结构。无论你怎么切,这都是禁忌;您失去了集合的强类型,您的代码会相当膨胀,因为您需要几行代码来执行即使是最简单的get或set操作,并且反射的本质可能比已知静态类型的等效操作慢100倍。

您必须为结果声明类型,因为据我所知没有办法直接声明匿名类型的实例。即使您将它存储在一个值中,您也不能在创建它的作用域之外使用它。

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

你可以做一个List<Object>,在你的代码中你可以测试类型,如:

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