在C#中使用自定义属性来装饰方法结果

时间:2011-01-13 03:22:05

标签: c# decorator custom-attributes

  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) );
    }

我可以在方法上使用自定义属性来处理装饰吗?结果代码看起来像这样。使用ClientFilter调用All方法会自动修饰结果。

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

2 个答案:

答案 0 :(得分:1)

您正在寻找PostSharp,它允许您使用属性修改方法行为。

然而,它会增加极大的复杂性,并且可能不值得这么简单。

答案 1 :(得分:0)

如果我理解你在问什么,那么答案可能是肯定的,但使用属性的复杂性并不值得。将您的第二个代码示例简单地如下所示不是更简单吗?

// 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) );
}