使用属性调用方法

时间:2012-11-03 16:47:28

标签: c# reflection architecture attributes aop

我有各种各样的方法,在继续自己的实现之前都需要执行相同的功能。现在我可以在每个方法中实现这些函数,但我想知道是否有办法利用attributes来执行此操作?作为一个非常简单的示例,所有网络呼叫都必须检查网络连接。

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

这可行,但我必须为使用网络的每个方法调用IsNetworkConnected方法并单独处理它。相反,我想这样做

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

如果网络不可用,则会调用错误方法,忽略GetPage,否则会调用GetPage

这听起来非常像Aspect Orientated Programming,但我不想为几个调用实现整个框架。这是一个学习练习而不是实施练习,所以我很好奇这样的事情是如何最好地实现的。

3 个答案:

答案 0 :(得分:3)

您可以使用PostSharp,它是面向方面的.NET框架,似乎是quite easy to use

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

答案 1 :(得分:1)

我认为你不能仅使用attributes执行此操作,因为如果您没有主动执行某些操作,它们不会被运行时执行。一个轻量级的方法是Ninject with Interceptions extension,它是一个框架,但是非常薄,而且你可能已经在使用DI了。

另一个选项,但更多涉及,可以基于MEF,然后您可以使用属性并在激活期间执行某些操作。

答案 2 :(得分:1)

你是对的,听起来很像AOP 您所追求的是听起来像编译时编织?即该属性由编译器转换为附加代码 你可以看看如何实现这个...
Generating additional code through a custom attribute
http://www.cs.columbia.edu/~eaddy/wicca/&
http://www.sharpcrafters.com/aop.net/compiletime-weaving
所有这些都涉及这样做的工具和技术。

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