использование пользовательского атрибута в C # для украшения результата метода - PullRequest
1 голос
/ 13 января 2011
  public IQueryable<T> All()
    {
        var session = _sessionFactory.GetCurrentSession();
        return FilterByClientId(from r in session.Query<T>() select r);
    }

    public IQueryable<T> FilterByClientId(IQueryable<T> queryable)
    {
        return queryable.Where(row => _clientIds.ClientIds.Contains<long>(row.ClientId) );
    }

Могу ли я использовать пользовательский атрибут в методе обработки украшения?результирующий код будет выглядеть примерно таквызов метода All с ClientFilter автоматически украсит результат.

[ClientFilter]
    public IQueryable<T> All()
    {
        var session = _sessionFactory.GetCurrentSession();
        return from r in session.Query<T>() select r;
    }

Ответы [ 2 ]

1 голос
/ 13 января 2011

Вы ищете PostSharp , который позволяет изменять поведение метода с использованием атрибутов.

Однако, это добавит огромную сложность и, вероятно, не будет стоить чего-то такого простого.

0 голосов
/ 13 января 2011

Если я понимаю, что вы спрашиваете, то ответ, вероятно, да, но сложность использования атрибутов не стоит. Не проще ли сделать второй пример кода следующим образом?

// Edited to make more sense, but see below...
public IQueryable<T> FilterByClientId()
{
    return All().Where(row => _clientIds.ClientIds.Contains<long>(row.ClientId) );
}

РЕДАКТИРОВАТЬ: на основе вашего комментария, попробуйте определить FilterByClientId как метод расширения с общим ограничением:

public static IQueryable<T> FilterByClientId(this IQueryable<T> queryable) where T : IHasClientId
{
    return queryable.Where(row => _clientIds.ClientIds.Contains<long>(row.ClientId) );
}
...