2015-06-08 2 views
0

Сегодня у меня возникла небольшая проблема, и, к сожалению, я не нашел хорошего решения. Я хотел бы создать метод расширения для некоторого общего интерфейса. Этот метод принимает другой тип родового параметра, как показано нижеКак создать общий метод расширения с дополнительным типом для общего интерфейса

public interface IGenericInterface<TSource> 
{ 
    void DoSomething<TDest>(); 
} 

DotNetFiddle

Как вызвать метод DoSomething2 точно таким же образом, как DoSomething метода (без прохождения первого типа)?

public void DoSomething<TDest>() 
//Called like below 
testClass.DoSomething<object>(); 

вместо (как моей текущей подписи)

public static void DoSomething2<TDest, TSource>(this IGenericInterface<TSource> interf) 
//called like below 
testClass.DoSomething2<string, object>(); // have to repass object type 

Я знаю, что компилятор не может автоматически вывести второй тип (link). Но мне любопытно, нашел ли кто-нибудь решение.

+3

В будущем, пожалуйста, включите в свой текст весь соответствующий код (как текст). Скрипки великолепны, но они не заменяют действительный код. Я редактировал часть вашего кода в ваш вопрос. – ryanyuyu

+1

Это невозможно. Теоретически, C# потенциально может вывести первый тип, но он либо вводит все аргументы типа, либо нет, вы не можете иметь частичный вывод. – Kenneth

+0

@ryanyuyu спасибо, я буду помнить об этом. Кеннет, к сожалению, только такая информация приходит ко мне. Мне кажется, что не было бы проблем, если бы компилятор мог вывести второй тип. В этом случае метод расширения трудно понять. –

ответ

2

Ваша проблема в том, что аргумент - вы зависите от ввода типа для обработки первого типа общего типа, но затем вы хотите явно указать второй - это просто невозможно в C#.

Вместо этого, почему бы не изменить тип аргумента?

public static void DoSomething3<T, T2>(this IGenericInterface<T> interf, T2 parameter) 
//called like below 
testClass.DoSomething3((object)3); 

С этим T выводится на основе testClass (до тех пор, как это не неоднозначной), и T2 выводится на основе (object)3.

+0

К сожалению, я не могу явно передать объект этому методу. Я исправил содержание вопросов, чтобы лучше прояснить эту проблему, –

+0

@PawelMaga Ну, слишком плохо. Если вы действительно хотите избежать повторения первого аргумента, у вас может быть такой метод, как DoSomething (этот ..., аргумент T2) ', причем аргумент существует только для вывода типа - вы могли бы затем вызвать' testClass.DoSomething3 (по умолчанию (объект)) 'или' testClass.DoSomething3 (по умолчанию (строка)) '. Конечно, вам все равно нужно знать правильный тип во время выполнения. – Luaan

Смежные вопросы