使用属性调用方法(Using Attributes to Call Methods)

2019-08-02 06:32发布

我有这都需要在继续用自己的执行之前,执行相同功能的不同个体的方法。 现在,我可以实现在每个方法这些功能,但我不知道是否有一种方法利用attributes做到这一点? 作为一个非常简单的例子,所有的网络电话要检查网络连接。

public void GetPage(string url)
{
   if(IsNetworkConnected())
      ...
   else
      ...           
}

这将工作,但我不得不致电IsNetworkConnected为使用网络的每个方法的方法和单独处理。 相反,我想这样做

[NetworkCall]
public void GetPage(string url)
{
   ...
}

如果网络不可用,一个错误就被调用和GetPage被忽略,否则GetPage被调用。

这听起来很像看点导向编程,但我不希望实施了几个电话的整个框架。 这更是一个学习锻炼比实现一个的,所以我很好奇,怎么这样的事情会得到更好的实现。

Answer 1:

您可以使用PostSharp ,它是.NET面向方面的框架,它似乎很容易使用 :

static void Main(string[] args)
{
    Foo();
}

[IgnoreMethod(IsIgnored=true)]
public static void Foo()
{
    Console.WriteLine("Executing Foo()...");
}

[Serializable]
public class IgnoreMethodAttribute : PostSharp.Aspects.MethodInterceptionAspect
{
    public bool IsIgnored { get; set; }

    public override void OnInvoke(PostSharp.Aspects.MethodInterceptionArgs args)
    {
        if (IsIgnored)
        {
            return;
        }

        base.OnInvoke(args);
    }
}

方法级别方面功能都可以在免费版: http://www.sharpcrafters.com/purchase/compare

运行时的性能:

由于PostSharp是一个编译器技术,最昂贵的工作在构建时完成,以便应用程序快速启动和快速执行。 当生成代码,PostSharp取假设调用虚拟方法或获取一个静态字段是昂贵的操作。 相反的传闻,PostSharp并不在运行时使用的System.Reflection。 http://www.sharpcrafters.com/postsharp/performance



Answer 2:

我不认为你可以做到这一点attributes而已,因为如果你不积极做好与他们的东西,他们不会被运行时执行。 一个轻量级的方法是Ninject与拦截的扩展 ,它是一个框架,而是一个非常薄的一个,和一个你可能已经无论如何使用DI。

另一种选择,但更复杂一些,可以基于MEF ,然后你可以使用属性和激活过程中与他们在做些什么。



Answer 3:

你说得对,这听起来很像AOP。
你喜欢编译时编织的声音之后是什么? 即,属性是由编译器变成额外的代码。
你可以看一下如何实现这个...
通过自定义属性来生成额外的代码
http://www.cs.columbia.edu/~eaddy/wicca/ &
http://www.sharpcrafters.com/aop.net/compiletime-weaving
所有的参考工具和这样的技术。

或者你可以使用一个AOP框架。 恕我直言,你应该看看AOP框架。



文章来源: Using Attributes to Call Methods