【问题标题】:What is the C# equivalent of something like the around_filter found in the Rails ActionController class?在 Rails ActionController 类中找到的类似 around_filter 的 C# 等价物是什么?
【发布时间】:2012-05-31 00:08:38
【问题描述】:

我继承了一些遗留代码,其中每个方法都带有:

Method()
{
   Log("Entering");
   ...
   Log("Exiting");
}

之类的。这很丑陋,确实重复了大约一千次。有没有办法像 Rails 中的那样添加全局“around_filter”?

【问题讨论】:

  • 如何删除呼叫并仅将其留在有意义的地方?当抛出异常时,您确实有调用堆栈,因此您不一定需要为每个方法都这样做。
  • @BryanCrosby 好吧,在这种情况下这是一个选项,但这并不是我真正要问的。

标签: c# ruby-on-rails filter


【解决方案1】:

这可以通过Aspect Oriented Programming 通过像PostSharp 这样的方面编织工具来完成。对于 PostSharp,OnMethodBoundaryAspect 提供了这种类型的功能。

【讨论】:

    【解决方案2】:

    另一种选择是设置一个 Logger 类。比如:

    public static class Logger
    {
        public static void Invoke(Delegate del, params object[] args)
        {
            Console.WriteLine("Entering");
            del.DynamicInvoke(args);
            Console.WriteLine("Exiting");
        }
    
        public static T Invoke<T>(Delegate del, params object[] args)
        {
            Console.WriteLine("Entering");
            T rv = (T)del.DynamicInvoke(args);
            Console.WriteLine("Exiting");
            return rv;
        }
    }
    

    然后你可以这样使用它:

    static void Main(string[] args)
    {
        Logger.Invoke(new Action<int>(CountTo), 10);
        Console.WriteLine("5 * 2 = {0}", Logger.Invoke<int>(new Func<int, int>(TwiceAsBig), 5));
    }
    
    static void CountTo(int num)
    {
        for (int i = 1; i <= num; ++i)
            Console.WriteLine(i);
    }
    
    static int TwiceAsBig(int num)
    {
        return num * 2;
    }
    

    【讨论】:

    • 请注意,如果您使用 Invoke&lt;T&gt;(Action&lt;T&gt; del, T arg)Invoke&lt;T,U&gt;(Action&lt;T,U&gt; del, T arg1, U arg2) 之类的重载定义 Invoke,则可以将其称为:Logger.Invoke(CountTo, 10),这样更易​​于阅读...
    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多