代码之家  ›  专栏  ›  技术社区  ›  Graviton

使用属性检查是否访问方法

  •  4
  • Graviton  · 技术社区  · 15 年前

    我有一个方法,它只有在满足某个条件时才可访问,如果不满足,那么该方法就不会被执行。目前,我是这样编码的:

    public void CanAccessDatabase()
    {
       if(StaticClass.IsEligible())
       {
          return;
       }
       // do the logic
    }
    

    现在,这个代码很难看,因为在不存在的地方 if(StaticClass.IsEligible()) 与方法无关的条件。

    所以我想把 IsEligible 方法,以便我的代码看起来像这样。 如果条件没有满足,那么该方法将只返回而不执行下面的逻辑。

    [IsEligibleCheck]
    public void CanAccessDatabase()
    {
       // do the logic
    }
    

    当然,资格是一个运行时决定。

    关于如何为 IsEligibleCheck ?谢谢

    编辑:我知道Postshap可以做到这一点,但我正在寻找一些现成的东西,而不是依赖于任何第三方库。

    6 回复  |  直到 12 年前
        1
  •  3
  •   jason    15 年前

    关于如何为 IsEligibleCheck ?

    这是AOP的最佳地点。

    编辑:我知道Postshap可以做到这一点,但我正在寻找一些现成的东西,而不是依赖于任何第三方库。

    微软是否被视为第三方?如果没有,你可以看看 Unity 从他们 Patterns & Practices team . 看看 Interceptor 统一的机制。

    否则,您必须使用反射有效地滚动自己的实现。实际上,您需要做的是将对象包装在代理中,其中代理使用反射来检查属性并进行适当的解释。如果 等深线检查 成功,然后代理调用包装对象上的方法。实际上,只需重用已经存在的实现就更容易了。

    我的建议是使用Unity(或另一个AOP解决方案)。

        2
  •  2
  •   Lasse V. Karlsen    15 年前

    不幸的是,属性不会在运行时执行。一些内置属性修改了编译后的代码,比如MethodImpl属性和类似的属性,但所有自定义属性都只是元数据。如果没有代码去寻找元数据,那么它将位于那里,根本不会影响程序的执行。

    换句话说,你需要那个if语句 在某处 .

    除非你能使用像这样的工具 PostSharp 如果没有对属性的显式检查,就无法在.NET框外完成此操作。

        3
  •  2
  •   Community CDub    7 年前

    这看起来是一个完美的候选人 AOP . 简而言之,这意味着 CanAccessDatabase 逻辑将存在于“方面”或“拦截器”中,也就是说, 分离 从业务逻辑,从而实现 separation of concerns (方面只负责安全,业务代码只负责业务)。

    在C中,有两种常用的AOP选项 Castle.DynamicProxy PostSharp . 各有利弊。 This question 总结他们的分歧。

    Here are other options 对于在.NET中执行AOP,其中一些可以在没有第三方库的情况下完成。我仍然建议使用dynamicproxy、postsharp、linfu、spring.aop或unity,其他解决方案都没有那么灵活。

        4
  •  2
  •   Ash    15 年前

    自定义属性与反射密切相关。

    您需要创建另一个类,该类负责调用CanAccessDatabase()类中的方法。

    使用反射,这个新类将确定每个方法的属性。如果找到iseligible check属性,它将执行staticlass.iseligible()检查,并且仅在检查通过时调用canaccessdatabase()。

    希尔斯 an introduction 在msdn做这个。它使用memberinfo.getCustomAttributes()方法旋转。

    以下是伪代码:

    Get the Type of the CanAccessDatabase() class
    Using this type, get all methods in this class (optionally filtering public, private etc).
    Loop through the list of methods
        Call GetCustomAttributes() on the current method.
        Loop through the list of custom attributes
            If the IsEligibleCheck attribute is found
                If StaticClass.IsEligible is true
                    Call the current method (using MethodInfo.Invoke())
                End If
            End If
        End Loop
    End Loop
    
        5
  •  1
  •   Chuck Savage    14 年前

    我知道这是一条旧线…

    您可以使用条件属性: http://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx

    “向编译器指示除非定义了指定的条件编译符号,否则应忽略方法调用或属性。”

    #define IsEligibleCheck // or define elsewhere 
    
    [Conditional("IsEligibleCheck")]
    public void CanAccessDatabase()
    {
       // do the logic
    }
    
        6
  •  0
  •   Muhammad Soliman    12 年前

    检查AOP,它将在这方面帮助您很多,市场上的一个强大组件是 PostSharp