是否有可能使扩展方法知道它被调用的语法?

时间:2014-03-06 16:59:48

标签: c# extension-methods

编辑:集体“嘿笨”是一个非常好的提醒,重新思考我原来的问题。我的好奇心仍然存在于主题上,所以我已经删除了不好的想法。

给出一个扩展方法:

public static class Util {
  public static string Triple<T>(this T t) { 
    var builder = new StringBuilder(); 
    foreach (char c in t.ToString()) {
      builder.Append(c, 3);
    }
    return builder.ToString();
  }
}

我知道我可以使用实例成员语法来调用此方法,即。 foo.Triple(),或使用静态方法语法Util.Triple(foo)。我是否有办法让扩展方法知道它的调用方式?考虑(不是有效的C#):

public static class Util {
    public static string Triple<T>(this T t) { 
      if (calledStatic) {
        // do something if called by static syntax
      } else {
        // do something if not called by static syntax
      }
      var builder = new StringBuilder(); 
      foreach (char c in t.ToString()) {
        builder.Append(c, 3);
      }
      return builder.ToString();
    }
}

我已经检查了C#语言规范,特别是关于扩展方法,SO问题,并且我不知所措。

底线版本:我可以让扩展方法知道它的调用方式吗?

2 个答案:

答案 0 :(得分:2)

没有。你不能。无论如何,编译器会将您的扩展方法实例调用更改为静态方法调用。

答案 1 :(得分:2)

那是不可能的。扩展方法只是“编译魔术”,foo.Triple()的编译版本无论如何都会看起来像Util.Triple(foo)