动态表达方法

时间:2014-07-16 19:28:49

标签: linq dynamic

我有以下代码:

return Expression.Call(
    typeof(System.Linq.Enumerable),
    "Like",
    new Type[] { typeof(string) },
    Expression.Constant(filter.Value),
    Expression.Coalesce(member, Expression.Constant(string.Empty))
);

好吧,所以我不想使用“Contains”,而是想创建自己的名为“Like”的扩展方法,然后做一些特定的事情。我开始创建一个像普通的扩展方法:

public static bool Like<TSource>(this IEnumerable<TSource> source, TSource value)
{
    return true;
}

我现在正在回归尝试让事情发挥作用。我得到的错误是“Like”不是Enumerable的方法。我可以使用它自己的新扩展方法,但不能在expression.call中使用。

任何想法可能是什么问题?我的意思是,如果我想要精确的文本搜索,“包含”就可以了,但我真的想要方法所暗示的,“喜欢”搜索。

谢谢,

大卫

1 个答案:

答案 0 :(得分:0)

第一个代码是调用静态Enumerable.Contains<T>(Ienumerable<T>,T) - 它不是作为扩展方法触发的,而是作为常规静态方法调用触发的。

例如,如果你有:

public static class StringExtensions
{
    public static bool Like<TSource>(this IEnumerable<TSource> source, TSource value)
    {
        return true;
    }
}

你应该写:

Expression.Call(
    typeof(StringExtensions),   // the class that contains the extension method
    "Like",
    new Type[] { typeof(string) },
    Expression.Constant(array), // this is the IEnumerable<string>
    Expression.Constant(String.Empty)
);