1

范围可能不是正确的词。使用以下代码,我无法访问集合元素的对象属性。是否有更好的返回数据类型或访问这些属性的方法?

protected object Modules()
{
    DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/"));
    var folders = from x in di.GetDirectories()
                    where
                    !(new string[] {
                        "app_data","bin","obj","scripts","styles","properties"
                        }).Contains<string>(x.Name.ToLower())
                    select new
                    {
                        Name = x.Name,
                        Path = x.FullName
                    };
    return folders
}
4

4 回答 4

5

有两种可行的解决方案:

  1. 为它创建一个真正的类。这是首选的解决方案。
  2. 让您的方法返回dynamic而不是object. 这样做的问题是您失去了对使用此方法结果的代码的编译时检查。
于 2012-11-29T17:34:55.640 回答
1

一旦离开定义匿名类型的范围,就必须使用反射来获取其成员。

我能想到的另外两个选项是使用动态类型(如果使用 4.0 框架或更高版本)或创建定义类型而不是匿名类型。

于 2012-11-29T17:34:27.373 回答
1

我建议简单地创建一个新类型来传递数据。如果数据的范围受到保护,您可以使用受保护的嵌套子类来防止小型数据类的过度增殖。

于 2012-11-29T17:35:21.660 回答
0

改为使用IEnumerable<dynamic>

根据 msdn 的说法,“动态类型使发生它的操作能够绕过编译时类型检查。相反,这些操作在运行时解决。动态类型简化了对 COM API 的访问,例如 Office 自动化 API,并且还动态 API,例如 IronPython 库,以及 HTML 文档对象模型 (DOM)。”

http://msdn.microsoft.com/en-us/library/dd264741.aspx

于 2012-11-29T17:34:19.247 回答