使用c#中的扩展方法实现接口

Mas*_*oud 5 c# extension-methods interface

我有一个界面:

public interface IMessager
{
    void ShowMessage();
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用扩展方法实现此接口?

public static class Extensions
{
  public static void ShowMessage(this MyClass e)
  {
      Console.WriteLine("Extension");
  }
}
Run Code Online (Sandbox Code Playgroud)

以及实现它的类:

public class MyClass:IMessager
{
    public void ShowMessage()
    {
        ShowMessage(); // I expect that program write "Extension" in console
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行程序时,我得到了System.StackOverflowException.

dav*_*v_i 10

您发布的代码只是一种递归调用自身的方法(因此StackOverflowException).

我不完全确定你要完成什么,但要回答你的问题

有没有办法使用扩展方法实现此接口?

没有.

但是,为了更加务实,如果你的目标只是在你有几个选择后编写你的方法:

1.明确调用扩展名

public class MyClass:IMessager
{
    public void ShowMessage()
    {
        Extensions.ShowMessage(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然正如评论中所指出的那样,这基本上违背了使用扩展方法的要点.此外,还有"样板代码",这样每次实现界面时都必须从方法中调用静态方法(不是非常)

2.使用抽象类而不是接口

public abstract class MessengerBase
{
    public void ShowMethod() { /* implement */ }
}

public class MyClass : MessengerBase {}

...

new MyClass().ShowMethod();
Run Code Online (Sandbox Code Playgroud)

这个问题是你不能从多个类继承.

3.在界面上使用扩展名

public interface IMessenger { /* nothing special here */ }

public class MyClass : IMessenger { /* also nothing special */ }

public static class MessengerExtensions
{
    public static void ShowMessage(this IMessenger messenger)
    {
        // implement
    }
}

...

new MyClass().ShowMessage();
Run Code Online (Sandbox Code Playgroud)