我正在尝试确定两个谓词的相等性:
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'的值?
答案 0 :(得分:0)
你需要使用Expression's。它们包含func,但它们也包含语法树,您可以在运行时检查它们的“源代码”。
答案 1 :(得分:0)
如果我理解正确,那么您正在尝试确定委托内捕获变量的值。我很确定没有简单的方法可以做到这一点......也许如果你使用表达式树代替委托,它会更简单吗?
另一种选择(可能更简单)是将值传递给EntityCache
另请注意,而不是
if (EntityCache.ContainsKey(predicate.GetHashCode()))
return EntityCache[predicate.GetHashCode()];
最好使用TryGetValue