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

发布于 2024-10-11 10:44:06 字数 683 浏览 9 评论 0原文

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

Can I make use of Custom Attribute on the method to handle the decoration? the resulting code would look something like this. call to All method with the ClientFilter would automatically decorate the result.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小清晰的声音 2024-10-18 10:44:06

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

然而,这会增加巨大的复杂性,并且对于如此简单的事情可能不值得。

You're looking for PostSharp, which allows you to modify method behavior using attributes.

However, it will add tremendous complexity and probably isn't worth it for something this simple.

女皇必胜 2024-10-18 10:44:06

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

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

If I understand what you are asking, then the answer is probably yes, but the complication of using attributes isn't worth it. Wouldn't it be simpler to make your second code sample simply be as follows?

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

EDIT: Based on your comment, try defining FilterByClientId as an extension method with a generic constraint:

public static IQueryable<T> FilterByClientId(this IQueryable<T> queryable) where T : IHasClientId
{
    return queryable.Where(row => _clientIds.ClientIds.Contains<long>(row.ClientId) );
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文