2009-10-29 77 views
1

我试图循环返回一个匿名的结果对象的函数的结果。.net 3.5 anonymous foreach

public static object getLogoNav() 
{ 
    XDocument loaded = XDocument.Load(HttpContext.Current.Request.MapPath("~/App_Data/LOGO_NAV_LINKS.xml")); 

    var query = from x in loaded.Elements().Elements() 
       select new 
       { 
       Name = x.FirstAttribute.Value, 
       Value = x.Value 
       }; 

    return query; 
} 

代码隐藏页:

var results = Common.getLogoNav(); 
    foreach(var nav in results) { 
    string test = nav.Name; 
    } 
+3

你的问题是什么? – 2009-10-29 00:15:44

+0

它不起作用。 – phxis 2009-10-29 00:46:56

回答

5

你不能有一个匿名类在C#3(和4为此事)返回类型,你就不能施放对象为匿名类型。你三个选项:

  • 做(大部分时间,这是法)匿名类的范围之内环路
  • 铸造反对和使用反射(慢,不是很容易的事,除非你做一些表达树魔术)
  • 转换为一个命名的类,并返回和实例。 (在C#4中)你可以创建一些动态类型的魔术来获得类似的效果,但是与某些语法糖的选项2是一样的。
+0

我很难同意这一点。仅仅是因为我有类似的功能被用作某些控件的数据源,并且这些控件能够正确地循环访问结果。这告诉我必须进行一些铸造才能使这个循环正常工作。没有? – phxis 2009-10-29 00:23:17

+0

“匿名类型的名称由编译器自动生成,不能在程序文本中引用。” - 由于您无法命名,因此无法将其退回,也无法投射。当然,除了Jon Skeet的泛型类型参数hack,但你真的不应该使用它。这是纯粹的邪恶。 – 2009-10-29 00:41:03

+0

phxis:你说得对,你可以从C#方法返回匿名类型的对象。但是这些控件基本上是在运行时反映这些对象的:它们不需要编译时访问匿名类型。而在你的代码中,你试图获得对成员的编译时访问权限,如果没有Yuriy指出的可怕的黑客,你就无法做到这一点。 – itowlson 2009-10-29 00:42:06

2

Jon Skeet写了一个关于返回匿名类型的entry。我希望你不要使用它。