Подтвердить что ты не робот

Метод расширения С# в качестве реализации интерфейса

Мне было интересно, может ли метод расширения С# какого-то класса действовать как реализация интерфейса? Что у меня есть:

Итерал:

 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,);
    }
4b9b3361

Ответ 1

это невозможно сделать так, как вы его описываете: разрешение вызова метода С# всегда будет выбирать конкретную реализацию вашего метода, а не метод расширения.

Однако я считаю, что вы можете -somewhat- получить то, что вы хотите, если вы НЕ определяете метод в интерфейсе, а просто как методы расширения в разных пространствах имен. Конечно, это "статический", поскольку вызываемый метод все равно будет выбран во время компиляции.

Практически говоря, вы затем выбираете метод, называемый правой директивой "using" (аналогично тому, как работает LINQ)

Ответ 2

Нет, методы расширения не могут действовать как реализация для интерфейса. Методы расширений - это просто синтаксический сахар для статического метода, который принимает экземпляр этого класса в качестве первого параметра, поэтому не является членом определенного класса, что является требованием для реализации интерфейса.

Ответ 3

Это невозможно.

Методы интерфейса должны быть реализованы самим типом реализации.

Методы расширения - это концепция на уровне языка (синтаксический сахар), и это не поможет. Сама CLR полностью не знает о методах расширения,

Ответ 4

var sim = new Sim()
((IEventHandler )sim).Notify(ev)