如何访问Func的值?

本文关键字:函数 目标 bool 的值 Client 何访问 访问 Func | 更新日期: 2023-09-27 18:04:08

我有一个c#方法,声明如下:

public IEnumerable<ClientEntity> Search(Func<Client, bool> searchPredicate)
{
    // Uses the search searchPredicate to perform a search.
}

这个方法像这样调用:

string searchCriteria = "My Search Criteria";
bool searchOnlyActive = false;
myClientService.Search(c => c.Name.Contains(searchCriteria) && (c.Active || !searchOnlyActive));

现在,如果我在该方法的开头抛出一个断点,并且在Immediate窗口中查看searchPredicate属性,当我键入searchPredicate时。目标,我得到这样的内容:

{MyNamespace.ClientsService.}
    searchCriteria: "My Search Criteria"
    searchOnlyActive: false

我想要的是实际获得"我的搜索标准"值和那里显示的假值,就像调试器一样,但我没有设法作为目标属性的类型类似于"<> c_displayclass2",我不知道它来自哪里。我知道这是可以做到的,因为调试器做到了,我只是不知道怎么做。

任何想法?谢谢!

如何访问Func<Client的目标函数bool>的值?

<>c__DisplayClass2是编译器为获取捕获上下文而创建的类。你可以直接使用反射:

object target = searchPredicate.Target;
if(target != null) {
    foreach(var field in target.GetType().GetFields()) {
        Console.WriteLine("{0}={1}", field.Name, field.GetValue(target));
    }
}
输出:

searchCriteria=My Search Criteria
searchOnlyActive=False
然而

!除非你了解匿名方法和捕获的变量(以及如何在编译器生成的上下文类中实现),否则我认为这不会达到你想要的效果;例如,可能没有上下文(Targetnull),或者多个嵌套上下文…

也:通过Expression<Func<Client,bool>>表达式树更容易检查,如果这是你的意图。