我正在使用ASP.NET 4和C#的LINQ to SQL。我创建了一个LINQ查询,产生一个新的LIST(即ToList())。返回的LIST是ANONYMOUS类型,因为它是由查询动态创建的。我希望能够在后面的代码中在页面级别声明一个变量,这样我就可以在其他函数中使用它,也可以在首页上使用'<%=%>'。
Visual Studio告诉我结果是匿名类型,但是给了我类名,例如:{CLASS1,CLASS2}。
如何声明此匿名类型的变量?
答案 0 :(得分:1)
你必须为结果声明一个类型,因为我无法直接声明一个匿名类型的实例。即使将它存储在一个值中,也无法在创建它的范围之外使用它。
您可以使用反射来获取值,并将变量声明为类型IList
,但这比创建新类型要多得多。
答案 1 :(得分:1)
匿名类型,就其本质而言,无法明确“声明”。他们是匿名的,未知的;你没有要申报的类型。因此,匿名类型(无论是直接类型还是作为泛型类型参数)都不能指定为参数,用作返回类型或存储到任何显式类型变量。您必须使用var
来分配它们,这意味着您几乎只限于在本地范围内使用该类型。
您唯一的选择,基本上是将您的匿名类型转换为可以显式声明的收集类型(即您必须声明类型本身)。只需创建一个简单的DTO类,在调用ToList之前,通过Select()Linq节点运行匿名类型,该节点使用匿名类型初始化强类。
如果您使用的是.NET 4.0,则可以转到dynamic
。 dynamic
关键字以及通过参数或返回类型声明为dynamic
的任何对象,基本上告诉编译器不要尝试验证对其执行的任何操作;您可以尝试使用任何运算符,调用任何方法等。但是,如果您正在执行的运算符,成员或任何其他操作对于对象实际在幕后的内容无效,您将获得运行时异常,你必须非常有力地处理。因此,不能轻易使用.NET 4.0的dynamic
功能。
正如Kratz所说,唯一可以做的就是返回一个ArrayList或一个Object []数组,并使用反射来发现匿名类型的结构。你切片的时候几乎没有任何关系;如果你需要几行代码来执行最简单的get或set操作,那么你的代码就会失去强大的类型,你的代码会大量膨胀,而且反射本质上可以比同等的操作慢100倍。已知静态类型。
答案 2 :(得分:0)
您可以执行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
}