c# - 获取 Predicate<T> 属性信息

标签 c# reflection

我有一个类似如下的界面:

public IEnumerable<IDocument> Search(Predicate<IDocument> predicate) { ... }

IDocument 看起来像这样:

public interface IDocument 
{
    string Id {get; set;}
    string Title {get; set;}
    ...
}

我即将实现一个文档提供程序,我必须在其中分解谓词的内容并提取属性,以便为我们目前没有 OR/M 映射的文档数据库创建 SQL 字符串。示例:我想知道用户是按 ID 还是按标题搜索,以便我知道我是否可以按 ID 搜索或必须对标题执行 LIKE 搜索。

我一直大量使用 LINQ,但这是我第一次坐在管道的另一端......我已经阅读了一些关于表达式树和反射的内容,但这些部分还没有落入地方呢。我如何(如果?)分解/反射(reflect)谓词,以便获得可以连接到 SQL 字符串中的参数列表?我正在寻找类似这个草图的东西:

public IEnumerable<IDocument> Search(Predicate<IDocument> predicate) 
{ 
    string id = DoSomeMagic(predicate, "Id");
    string title = DoSomeMagic(predicate, "Title");
    if (!string.isNullOrEmpty(id))
       ...make ID search
    else
       ...search by title
}

免责声明:该提供程序适用于今年秋天即将更换的内部遗留系统,这使得内联 SQL 成为正确的选择;o)

最佳答案

您不能对谓词或委托(delegate)执行此操作。它们是经过编译的,不可能获得有关它返回的内容的信息。为此,你确实需要 Expression 树,但你自己解析它可能很困难。您最好使用 O/RM 工具。

例如,当您将表达式与 LINQ to SQL 一起使用时,构建搜索方法将变得轻而易举:

public IEnumerable<Document> Search(
    Expression<Func<Document, bool>> predicate) 
{
    using (db = new DocumentDataContext())
    {
        return db.Documents.Where(predicate).ToArray();
    }
}

关于c# - 获取 Predicate<T> 属性信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2409442/

相关文章:

c# - 如何从 wcf 服务发送大型 xml 文件

java - 您可以通过反射代表另一个类调用方法吗

c# - .net 反射和 "params"关键字

Java - 从接口(interface)到实现的动态类转换

c# - 为任何方法创建 Func 或 Action(在 C# 中使用反射)

c# - 如何仅使用 AspNet.Identity 在站点之间发送和接收身份验证票

C#/.NET future 相对时间戳?

c# - 非 Windows 操作系统上的 .NET 框架 System.Windows.Form

c# - 可以在 C# 中组合两个 Actions 吗?

java - 使用反射的 javax.servlet.http.Cookie 的 NoSuchMethodException