Как проверить значение внутри параметра предиката c #?- Определение равенства предикатов - PullRequest
0 голосов
/ 26 декабря 2010

Я пытаюсь определить равенство двух предикатов:

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 => r.Id == id), как мне найти значение 'id' внутри моего метода FirstOrDefault?

Ответы [ 2 ]

0 голосов
/ 26 декабря 2010

Если я вас правильно понимаю, вы пытаетесь определить значение захваченной переменной внутри делегата. Я почти уверен, что нет простого способа сделать это ... возможно, если бы вы использовали дерево выражений вместо делегата, было бы проще? Другой вариант (возможно, намного более простой) - сохранить значения, передаваемые делегатам вместе с ними в EntityCache

Также обратите внимание, что вместо

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

Было бы лучше использовать TryGetValue

0 голосов
/ 26 декабря 2010

Вам нужно будет использовать Expression.Они содержат функции, но также содержат синтаксическое дерево, и вы можете проверить их «исходный код» во время выполнения.

...