C#扩展方法作为接口实现
我想知道是否某个类的C#扩展方法可以作为接口的实现吗? 我有什么:
一个iterface:
public interface IEventHandler { void Notify(SEvent ev, IEventEmmiter source); }
一个实现它的类:
class Sim : IEventHandler { /*public void Notify(SEvent ev, IEventEmmiter source) { Console.WriteLine("Got notified: " + ev.Name); }*/ }
而一个包含扩展方法的类:
public static class ReflectiveEventDispatcher { public static void Notify(this IEventHandler handler, SEvent ev) { if (handler.GetType().GetMethod("Handle" + ev.Name) != null) { // C# WTF? object[] prms = new object[0]; prms[0] = ev; handler.GetType().GetMethod("Handle" + ev.Name).Invoke(handler, prms); } else { throw new System.NotImplementedException("This object doesn't have appropriate handler methods for event " + ev.Name); } } }
现在,我想要有IEventHandler接口的各种类,接口的实现应该通过扩展方法来实现。
如果这是不可能的,是否有可能明确定义通知,然后转发到扩展方法的调用?
上面的代码基本上是一个多重inheritance黑客。 是否有可能通过任何(其他)手段来模拟这种行为?
(我希望这是有道理的,我已经习惯了Ruby,这让我很难过,哦,我怎么会想念你,亲爱的混蛋…)
更新
呼叫转移解决得很好:
public void Notify(SEvent ev) { ReflectiveEventDispatcher.Notify(this, ev,); }
这不能用你描述的方式来完成:C#方法调用的parsing总是会select你的方法的具体实现,永远不会是扩展方法。
不过,我相信如果不在接口中定义方法,只是在不同的命名空间中将其作为扩展方法,就能得到您想要的结果。 当然,这是“静态的”,因为所调用的方法仍然会在编译时被选中。
实际上,您然后select通过正确的“使用”指令调用的方法(类似于LINQ的工作方式)
否,扩展方法不能作为接口的实现。 扩展方法只是静态方法的语法糖,它将该类的一个实例作为第一个参数,因此不是特定类的成员,这是实现接口的一个要求。
这不可能。
接口方法必须由实现types本身来实现。
扩展方法是一个纯粹的语言级概念(语法糖),并没有帮助。 CLR本身完全不知道扩展方法,
var sim = new Sim() ((IEventHandler )sim).Notify(ev)