2010-10-23 3 views
12

У меня есть общий метод, как это (упрощенный вариант):Частичный вывод типа

public static TResult PartialInference<T, TResult>(Func<T, TResult> action, object param) 
{ 
    return action((T)param); 
} 

В приведенном выше описании, param имеет тип object по назначению. Это часть требования.

Когда я заполняю типов, я могу назвать это так:

var test1 = PartialInference<string, bool>(
    p => p.EndsWith("!"), "Hello world!" 
); 

Однако, я хотел бы использовать вывод типа. Предпочтительно, я хотел бы написать следующее:

var test2 = PartialInference<string>(
    p => p.EndsWith("!"), "Hello world!" 
); 

Но это не скомпилировано. Лучшее, что я придумал это:

var test3 = PartialInference(
    (string p) => p.EndsWith("!"), "Hello world!" 
); 

Поэтому я хотел бы иметь это в качестве параметра типа и до сих пор есть правильно набран возвращаемый тип, потому что мои реальные вызовы выглядят примерно так:

var list1 = ComponentProvider.Perform(
    (ITruckSchedule_StaffRepository p) => p.GetAllForTruckSchedule(this) 
) 

что очень некрасиво, и я хотел бы написать, как-то вроде этого:

var list2 = ComponentProvider.Perform<ITruckSchedule_StaffRepository>(
    p => p.GetAllForTruckSchedule(this) 
) 
+2

Вывод типа .NET - это все или ничего - никогда не частичный. – Dario

+0

Любые идеи для перезаписи метода, которые все равно избавятся от уродливого набора параметра 'p'? –

+0

@ Dario - это чрезмерное обобщение. Вывод типа - это функция C#, а другие языки .net могут обрабатывать ее по-разному. – CodesInChaos

ответ

15

Вы можете разделить т в общий метод на шаблонного типа:

class Foo<TOuter> { 
    public static void Bar<TInner>(TInner arg) {...} 
} 
... 
int x = 1; 
Foo<string>.Bar(x); 

Здесь ИНТ вывод, но строка явно.

+0

Спасибо, все. –

3

то, что вы пытаетесь достичь невозможно. Вам нужно указать оба общих аргумента или ни один из них, если возможно.

+0

Любые идеи для перезаписи метода, которые все равно избавятся от уродливого набора параметра 'p'? –

+0

Я думаю, что последняя версия у вас не так плоха: вам нужен дополнительный общий параметр для возвращаемого типа. –

+0

В этом весь смысл. Тип есть, 'GetAllForTruckSchedule' имеет тип возвращаемого значения, и я не хочу его указывать. Этот метод используется, например, в запросах Linq, и я хотел бы сделать вывод о том, что это работает как можно больше. 'var' весь путь :). –

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