如何检查c#谓词参数中的值? - 确定谓词相等性

时间:2010-12-26 19:23:46

标签: c# .net .net-4.0 c#-3.0 c#-4.0

我正在尝试确定两个谓词的相等性:

public T FirstOrDefault(Func<T, bool> predicate)
{
    if (EntityCache.ContainsKey(predicate.GetHashCode()))
        return EntityCache[predicate.GetHashCode()];
    else
    {
        var entity = _objectSet.FirstOrDefault<T>(predicate);
        EntityCache.Add(predicate.GetHashCode(), entity);
        return entity;
    }
}

我遇到的问题是谓词的哈希码没有考虑其中使用的值,我不知道如何检索它们。

例如,如果上面传递给我们方法的谓词是:(r =&gt; r.Id == id)我如何在FirstOrDefault方法中找到'id'的值?

2 个答案:

答案 0 :(得分:0)

你需要使用Expression's。它们包含func,但它们也包含语法树,您可以在运行时检查它们的“源代码”。

答案 1 :(得分:0)

如果我理解正确,那么您正在尝试确定委托内捕获变量的值。我很确定没有简单的方法可以做到这一点......也许如果你使用表达式树代替委托,它会更简单吗? 另一种选择(可能更简单)是将值传递给EntityCache

中的代表。

另请注意,而不是

if (EntityCache.ContainsKey(predicate.GetHashCode()))
    return EntityCache[predicate.GetHashCode()];

最好使用TryGetValue