如何访问Func <client,bool =“”>?</client,>的目标值

时间:2013-03-15 12:58:02

标签: c# linq

我有一个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));

现在,如果我在该方法的开头抛出一个断点,并查看立即窗口中的searchPredicate属性,当我输入searchPredicate.Target时,我会得到这样的结果:

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

我想要的是实际获得“我的搜索条件”值和那里显示的错误值,就像调试器那样,但我没有设法,因为Target属性的类型是“&lt; &gt; c__DisplayClass2“我不知道它来自哪里。我知道它可以完成,因为调试器会这样做,我只是不知道如何。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:4)

<>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>>的表达树更容易检查。