使用属性调用方法

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

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

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

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

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

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

你可以使用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); } } 

方法级方面function可在免费版中找到: http : //www.sharpcrafters.com/purchase/compare

运行时性能:

因为PostSharp是一种编译器技术,所以大部分昂贵的工作都是在构建时完成的,因此应用程序可以快速启动并快速执行。 在生成代码时,PostSharp假设调用虚方法或获取静态字段是一项昂贵的操作。 与谣言相反,PostSharp在运行时不使用System.Reflection。 http://www.sharpcrafters.com/postsharp/performance

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

另一个选项,但更多涉及,可以基于MEF ,然后您可以使用属性并在激活期间使用它们做一些事情。

你是对的,听起来很像AOP。
你在追求什么听起来像编译时编织? 即编译器将属性转换为附加代码。
你可以看看如何实现这个……
通过自定义属性生成其他代码
http://www.cs.columbia.edu/~eaddy/wicca/&
http://www.sharpcrafters.com/aop.net/compiletime-weaving
所有这些都涉及这样做的工具和技术。

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