我有一个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“我不知道它来自哪里。我知道它可以完成,因为调试器会这样做,我只是不知道如何。
有什么想法吗?谢谢!
答案 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
然而!除非您了解匿名方法和捕获的变量(以及如何根据编译器生成的上下文类实现),否则我认为这不会达到您想要的效果;例如,可能没有上下文(Target
为null
)或多个嵌套上下文......
另外:如果这是你的意图,通过Expression<Func<Client,bool>>
的表达树更容易检查。