本机动态Linq(C#)

本机动态Linq(C#),c#,dynamic,C#,Dynamic,是否可以使用c#5.0(.Net 4.5)中的dynamic关键字来创建动态LINQ查询 我知道使用第三方库可以做到这一点,但目前还不可行 举例说明我的观点最简单的方法是: class test { public int i { get; set; } } void Foo() { var collection = new[] { new test() { i = 1 }, new test() { i = 2 } };

是否可以使用c#5.0(.Net 4.5)中的
dynamic
关键字来创建动态LINQ查询

我知道使用第三方库可以做到这一点,但目前还不可行

举例说明我的观点最简单的方法是:

    class test
    {
        public int i { get; set; }
    }

    void Foo()
    {
        var collection = new[] { new test() { i = 1 }, new test() { i = 2 } };
        Bar(collection);
    }

    void Bar<T>(IEnumerable<T> collection)
    {
        //this works
        foreach (dynamic item in collection)
            if (item.i == 2)
            {
                //do something
            }

        //this does not - although this is what id like to use
        foreach (dynamic item in collection.Where(a => a.i == 2))
        {
            //do something
        }
    }
类测试
{
公共整数i{get;set;}
}
void Foo()
{
var collection=new[]{newtest(){i=1},newtest(){i=2};
酒吧(收藏);
}
空栏(IEnumerable集合)
{
//这很有效
foreach(集合中的动态项)
如果(项目i==2)
{
//做点什么
}
//虽然这是我想用的,但事实并非如此
foreach(集合中的动态项,其中(a=>a.i==2))
{
//做点什么
}
}
按请求编辑:生成编译器错误-

“T”不包含“i”的定义,并且找不到接受类型为“T”的第一个参数的扩展方法“i”(是否缺少using指令或程序集引用?)


替换条形图中的T声明以使用动态:

void Bar(IEnumerable<dynamic> collection)
{
    //this works
    foreach (dynamic item in collection)
        if (item.i == 2)
        {
            //do something
        }

    //this does compile
    foreach (dynamic item in collection.Where(a => a.i == 2))
    {
        //do something
    }
}
void条(IEnumerable集合)
{
//这很有效
foreach(集合中的动态项)
如果(项目i==2)
{
//做点什么
}
//这确实可以编译
foreach(集合中的动态项,其中(a=>a.i==2))
{
//做点什么
}
}

请添加特定的运行时/编译器错误。我非常喜欢这个。我也会胡乱猜测,如果与原始的
Bar()
相比,没有性能损失。我不知道性能如何,但我真的很讨厌编译时检查的丢失。一定要用彻底的单元测试来覆盖这一点。同意。使用
dynamic
总是让我觉得有点脏。