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