【问题标题】:C#4 Intercept method callC#4 拦截方法调用
【发布时间】:2010-08-23 22:33:53
【问题描述】:

我有这门课:

public class MyClass {
     public string GetText() {
         return "text";
     }
}

我想要的是有一个通用的缓存方法。如果调用GetText,我想拦截这个调用,比如;

public T MethodWasCalled<T>(MethodInfo method) {
    if(Cache.Contains(method.Name)) {
        return Cache[method.Name] as T;
    }
    else {
        T result = method.Invoke();
        Cache.Add(method.Name, result);
        return result;
    }
}

我希望以上内容解释了我想要完成的工作。对此有什么好的策略?

【问题讨论】:

    标签: methods c#-4.0 call intercept


    【解决方案1】:

    PostSharp 的边界方面可能是您所需要的。

    一些阐述:

    PostSharp 是一个构建过程库,可在编译时将 IL 注入二进制文件,以公开常规 .NET 范围内不可用的功能。

    边界方面允许您在成员访问之前和之后执行代码。有效地“包装”调用,让您执行奇特的逻辑。

    【讨论】:

      【解决方案2】:

      如果您使用的是 .NET 4,请查看 Lazy&lt;T&gt;

      public class MyClass {
          private Lazy<string> _text = new Lazy<string>(
              () => {
                  return "text"; // expensive calculation goes here
              });
      
          public string GetText() {
              return _text.Value;
          }
      }
      

      lambda 中的代码只会被执行一次。默认情况下它甚至是线程安全的。

      【讨论】:

      • 哎呀,我一直用这个!
      猜你喜欢
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 2010-12-09
      • 2012-04-01
      • 2021-09-16
      • 2015-04-29
      • 1970-01-01
      相关资源
      最近更新 更多