这是一个人为的例子:
public static class MyExtensions
{
public static void MyMethod( this MyInterface obj, string txt )
{
}
}
interface MyInterface {}
public MyDerived : MyInterface
{
void DoStuff()
{
MyMethod( "test" ); // fails; compiler can't find MyMethod?
}
}
在上面的例子中,我试图调用从派生类分配给接口的扩展方法。编译器在这里失败,并说MyMethod在当前上下文中不存在。我在我的CS文件中有所有适当的使用语句,所以我不确定发生了什么。
答案 0 :(得分:18)
尝试像this
:
this.MyMethod("test");
答案 1 :(得分:4)
这是替代解决方案(我首选):
(this as MyInterface).MyMethod("test");
为什么? - 因为前面提供的解决方案在扩展方法调用类的“新”方法(属性也是方法)的情况下不起作用。在这种情况下,可能打算在基类/接口声明的类型上调用扩展方法,这可能与派生类/接口的行为不同。
此外,此解决方案适用于“新”和“覆盖”方法,因为虚拟“覆盖”无论如何都会调用派生版本,这也是有意的。
编辑:如果你真的不想将“base”传递给扩展方法而是允许它接受“this”,这可能是无关紧要的。但是,您必须考虑行为差异。
另外,有趣的是作为Darin Dimitrov评论的答案:扩展方法不需要实例来运行它们,因为它们是静态方法。您可以通过向其传递参数来将扩展方法作为静态调用。但是,“base”不是扩展方法声明中标有“this”的参数的有效参数值,如果我是MS,则可以简化扩展方法的一般用法。
答案 2 :(得分:3)
请尝试以这种方式调用它:
this.MyMethod("test");
答案 3 :(得分:0)
将通话更改为
this.MyMethod("test")
此代码编译:
public static class MyExtensions
{
public static void MyMethod( this MyInterface obj, string txt )
{
}
}
public interface MyInterface {}
public class MyDerived : MyInterface
{
void DoStuff()
{
this.MyMethod( "test" ); // works now
}
}