编辑:集体“嘿笨”是一个非常好的提醒,重新思考我原来的问题。我的好奇心仍然存在于主题上,所以我已经删除了不好的想法。
给出一个扩展方法:
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问题,并且我不知所措。
底线版本:我可以让扩展方法知道它的调用方式吗?
答案 0 :(得分:2)
没有。你不能。无论如何,编译器会将您的扩展方法实例调用更改为静态方法调用。
答案 1 :(得分:2)
那是不可能的。扩展方法只是“编译魔术”,foo.Triple()
的编译版本无论如何都会看起来像Util.Triple(foo)
。