Мне было интересно, может ли метод расширения С# какого-то класса действовать как реализация интерфейса? Что у меня есть:
Итерал:
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, и реализация интерфейса должна выполняться методом расширения.
Если это невозможно, можно ли явно определить оповещение, а затем просто переслать вызов методу расширения?
Вышеприведенный код в основном представляет собой множественный наследование. Можно ли эмулировать это поведение любыми (другими) средствами?
(Надеюсь, это имеет смысл, я привык к Руби, и это очень тяжело мне. О, как я скучаю по тебе, мои дорогие миксины...)
Update
Переадресация звонков была решена довольно хорошо:
public void Notify(SEvent ev)
{
ReflectiveEventDispatcher.Notify(this, ev,);
}