Методы расширения на интерфейсах - PullRequest
2 голосов
/ 26 декабря 2009

У меня есть два интерфейса IDto1 и IDto2. IDto2 наследует IDto1. Оба интерфейса предназначены для DTO, поэтому я хочу, чтобы «сложный» код не использовался в их реализациях - я делаю это, помещая единственный метод расширения Initialize в статический класс для каждого интерфейса.

Таким образом, я получаю следующие типы IDto1, IDto2, IDto1Extensions, IDto2Extensions.

Я хотел бы иметь метод расширения Initialize на обоих интерфейсах, но для каждого иметь свою реализацию.

В коде клиента я хочу использовать такой код:

(dto as IDto1).Initialize();

... и я хотел бы, чтобы соответствующий метод расширения вызывался на основе разрешенного типа переменной dto во время выполнения.

Возможно ли это в C #, а если нет, то почему?

Edit:

Извините, конечно, это:

(dto as IDto1).Initialize();

... вызовет метод Initialize для типа IDto1 . Я имел в виду, что переменная dto будет передана в качестве аргумента методу, и я считаю, что метод будет выбираться полиморфно с учетом иерархии наследования, которую я указывал ранее.

Спасибо за все ваши ответы.

Ответы [ 5 ]

4 голосов
/ 26 декабря 2009

Глядя на ваше утверждение:

(dto as IDto1).Initialize();

... и я хотел бы, чтобы соответствующий метод расширения вызывался на основе разрешенного типа переменной dto во время выполнения.

«Разрешенный тип» вещи в скобках: точно IDto1. Это не может быть что-то еще, так что именно с этим будет работать компилятор. Действительно, переменные никогда не меняют тип (я полагаю, вы имеете в виду объект , на который ссылается значением переменной).

В .NET 4.0 / C # 4.0 здесь можно указать тип утки: метод экземпляра, а dynamic ...

((dynamic)dto).Initialize();

... но, честно говоря, я не понимаю, почему вы не можете просто добавить свой метод Initialize в интерфейс и использовать полиморфизм, поскольку это звучит ближе всего к тому, что вы пытаетесь описать.

4 голосов
/ 26 декабря 2009

То, чего вы пытаетесь достичь, это своего рода полиморфизм. Методы расширения являются статическими методами. В ООП полиморфизм применим только для экземпляров методов.

Можно также переключиться на абстрактные классы.

3 голосов
/ 26 декабря 2009

То, что вы пытаетесь выполнить, невозможно, поскольку методы расширения разрешаются во время компиляции, тогда как в вашем случае фактический тип переменной dto известен только во время выполнения.

1 голос
/ 26 декабря 2009

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

String className = ConfigurationManager.AppSettings["Interface"].ToString();

IDto1 dto = (IDto1)Activator.CreateInstance(Type.GetType(className));

В этом примере я использую первую строку для получения имени класса.

Во второй строке создается экземпляр объекта.

Гильерме Феррейра http://guilhermeferreira.wordpress.com/

0 голосов
/ 27 декабря 2009

Звучит как работа для абстрактного базового класса.

...