我正在使用Scott Guthrie描述的动态Linq库here。
Scott Guthrie的例子很棒,我使用了动态Where语句。然而,现在,我面临着需要使用动态选择功能的情况。 Scott Guthrie展示了这个功能的截图(在文章的最后一个截图中),但非常巧妙地从未解释过它。
问题是,即使代码编译并运行,我也看不出它是如何以任何有用的方式工作的。或许有反思?
以下是一个示例(请记住,您必须使用Guthrie在上面的文章中描述的Dynamic Linq库,这不是正常的Linq System.Linq)。
在我的示例中,我有一个带有UserId,FirstName和LastName字段的Users表。但是你使用什么数据库并不重要。这个问题很容易重现。这是我的示例代码:
首先确保您在顶部使用此声明:
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成员。
那么......这应该如何运作?如何获得匿名类型成员的访问权限?
答案 0 :(得分:4)
它可以很好地用于数据绑定(我怀疑这是它的预期用例),它在引擎盖下使用反射。它也适用于.NET 4.0中的dynamic
:
foreach (dynamic item in x) {
Console.WriteLine(item.UserId);
}
除此之外......反思或TypeDescriptor
。
foreach (object item in x) {
Console.WriteLine(item.GetType().GetProperty("UserId").GetValue(item, null));
}