2

我正在使用 Scott Guthrie在这里描述的动态 Linq 库。

Scott Guthrie 的例子很棒,我已经使用了相当多的动态 Where 语句。

但是,现在我面临需要使用动态选择功能的情况。Scott Guthrie 展示了此功能的屏幕截图(在文章的最后一个屏幕截图中),但非常聪明地从未解释过它。

问题是,即使代码编译并运行,我也看不出它如何以任何有用的方式工作。也许有反思?

这是一个例子(记住,你必须使用上面文章中Guthrie描述的Dynamic Linq Library,这不是正常的Linq System.Linq)。

在我的示例中,我有一个包含 UserId、FirstName 和 LastName 字段的用户表。但是你使用什么数据库并不重要。这个问题很容易重现。这是我的示例代码:

首先确保您在顶部有这个 using 语句:

    using System.Linq.Dynamic;

然后您可以运行以下代码:

using (DataClasses1DataContext dcdc = new DataClasses1DataContext())
        {
            var x = dcdc.Users.Select("new(UserId, FirstName, LastName)");
            foreach (var item in x)
            {                    

                Console.WriteLine(item.ToString());
            }
        }

如您所见,它编译并运行得很好。您从数据库中取回所有记录。但是,我无法找到实际访问新匿名类型的成员的方法。

因为 Select 查询是一个字符串,所以在设计时没有类型推断。所以我不能写:

Console.WriteLine(item.UserId);

编译器不知道匿名类型项有一个名为 UserId 的成员。因此该代码甚至不会编译(即使您在 For..Each 循环期间暂停调试器,您也会看到调试窗口看到有 UserId、FirstName 和 LastName 成员。

那么......这应该如何工作?您如何访问匿名类型的成员?

4

1 回答 1

4

它适用于数据绑定(我怀疑这是它的预期用例),它在引擎盖下使用反射。它也可以dynamic在 .NET 4.0 中正常工作:

foreach (dynamic item in x) { 
    Console.WriteLine(item.UserId);
}

除此之外......反射或TypeDescriptor

foreach (object item in x) {
    Console.WriteLine(item.GetType().GetProperty("UserId").GetValue(item, null));
}
于 2009-12-01T16:43:31.610 回答