3

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

我想要的是实际获得“我的搜索条件”值和显示在那里的错误值,就像调试器一样,但我没有设法,因为目标属性的类型类似于“<>c__DisplayClass2”我不知道那是从哪里来的。我知道它可以做到,因为调试器做到了,我只是不知道怎么做。

有任何想法吗?谢谢!

4

1 回答 1

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

然而!除非您了解匿名方法和捕获的变量(以及如何根据编译器生成的上下文类来实现),否则我认为这不会满足您的要求;例如,可能没有上下文(a Targetthat is null),或多个嵌套上下文...

另外:如果这是您的意图,则表达式树Expression<Func<Client,bool>>的可检查性要高得多。

于 2013-03-15T13:14:30.620 回答