Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .net 3.5匿名foreach_C#_.net_Foreach_Anonymous Types - Fatal编程技术网

C# .net 3.5匿名foreach

C# .net 3.5匿名foreach,c#,.net,foreach,anonymous-types,C#,.net,Foreach,Anonymous Types,我试图循环遍历返回匿名结果对象的函数的结果 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

我试图循环遍历返回匿名结果对象的函数的结果

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;
  }

在C#3(和4)中不能将匿名类作为返回类型,也不能将对象强制转换为匿名类型。你的三个选择是:

  • 在匿名类的范围内执行循环(大多数情况下,这是方法)
  • 投射到对象并使用反射(缓慢且不太容易做到,除非您使用一些表达式树魔术)
  • 转换为命名类并返回该类的实例
  • (在C#4中)您可以创建一些动态类型魔术来实现类似的效果,但这实际上与选项2相同,只是添加了一些语法糖

在C#3(和4)中不能将匿名类作为返回类型,也不能将对象强制转换为匿名类型。你的三个选择是:

  • 在匿名类的范围内执行循环(大多数情况下,这是方法)
  • 投射到对象并使用反射(缓慢且不太容易做到,除非您使用一些表达式树魔术)
  • 转换为命名类并返回该类的实例
  • (在C#4中)您可以创建一些动态类型魔术来实现类似的效果,但这实际上与选项2相同,只是添加了一些语法糖

Jon Skeet写了一篇关于返回匿名类型的文章。我希望你不要用它。

乔恩·斯基特写了一篇关于返回匿名类型的文章。我希望你不要用它。

我很难同意这一点。只是因为我有类似的函数用作某些控件的数据源,并且这些控件能够正确地循环结果。这告诉我,它必须是某种铸造需要使这个循环工作。否?“匿名类型的名称由编译器自动生成,不能在程序文本中引用。”-由于您无法命名它,因此无法返回它,也无法强制转换到它。当然,除了Jon Skeet的泛型类型参数hack之外,但是你真的不应该使用它。phxis:你是对的,你可以从C#方法返回匿名类型的对象。但这些控件在运行时基本上反映在这些对象上:它们不需要对匿名类型进行编译时访问。然而,在代码中,您试图获得对成员的编译时访问权,如果没有尤里所指的可怕的黑客攻击,您就无法做到这一点。DrJokepu:为了清楚起见,您可以返回匿名类型的对象。在编译时不能通过名称访问其成员。正如phxis所指出的,这通常不是问题,例如,当您计划将对象提供给数据绑定控件时,该控件将通过反射访问成员,并且不需要对类型进行编译时访问。@itowlson:是的,当然可以返回它。作为一个对象。我的意思是,不能将匿名类型作为返回类型。C#没有Fog Creek的芥末那么先进。我很难同意这一点。只是因为我有类似的函数用作某些控件的数据源,并且这些控件能够正确地循环结果。这告诉我,它必须是某种铸造需要使这个循环工作。否?“匿名类型的名称由编译器自动生成,不能在程序文本中引用。”-由于您无法命名它,因此无法返回它,也无法强制转换到它。当然,除了Jon Skeet的泛型类型参数hack之外,但是你真的不应该使用它。phxis:你是对的,你可以从C#方法返回匿名类型的对象。但这些控件在运行时基本上反映在这些对象上:它们不需要对匿名类型进行编译时访问。然而,在代码中,您试图获得对成员的编译时访问权,如果没有尤里所指的可怕的黑客攻击,您就无法做到这一点。DrJokepu:为了清楚起见,您可以返回匿名类型的对象。在编译时不能通过名称访问其成员。正如phxis所指出的,这通常不是问题,例如,当您计划将对象提供给数据绑定控件时,该控件将通过反射访问成员,并且不需要对类型进行编译时访问。@itowlson:是的,当然可以返回它。作为一个对象。我的意思是,不能将匿名类型作为返回类型。C#没有Fog Creek的芥末那么先进。