Я все еще новичок в работе с делегатами, и я играю со слоем доступа к данным на основе делегатов, описанным в книге Стивена Джона Метскера «Шаблоны проектирования в C #» (отличное чтение!). Он определяет делегата доступа к данным следующим образом:
public delegate object BorrowReader(IDataReader reader);
Результатом использования этого кода является код, который выглядит следующим образом:
var result = Foo.Bar(new BorrowReader(DoFooBarMagic));
var result = Foo.Bar(DoFooBarMagic);
Тем не менее, поскольку тип возвращаемого делегата - «объект», вам необходимо выполнить приведение, чтобы получить то, что метод (в данном примере «DoFooBarMagic») действительно возвращает. Поэтому, если «DoFooBarMagic» возвращает List, вам нужно сделать что-то вроде этого:
var result = Foo.Bar(DoFooBarMagic) as List<string>;
Что я хотел бы, так это иметь возможность пропустить приведение и получить тип возврата делегата, выведенный из типа возврата метода делегата. Я подумал, что, возможно, есть способ использовать параметр Type для вывода типа возвращаемого значения. Примерно так:
public delegate T BorrowReader<T>(IDataReader reader);
List<string> result = Foo.Bar(new BorrowReader(DoFooBarMagic));
//Look, Ma, no cast!
var result2 = Foo.Bar(DoFooBarMagic);
Где тип возврата выводится из типа возврата метода делегата, но, похоже, это не работает. Вместо этого вы должны сделать это:
public delegate T BorrowReader<T>(IDataReader reader);
var result = Foo.Bar(new BorrowReader<List<string>>(DoFooBarMagic));
Что вряд ли кажется лучше, чем у актеров.
Так есть ли способ вывести тип возврата делегата из типа возврата метода делегата?
Изменить для добавления:
Я могу изменить подпись Foo.Bar, если это будет необходимо. Текущая подпись по сути такова:
public static T Bar<T>(string sprocName,
DbParameter[] params,
BorrowReader<T> borrower);
Примечание: эта подпись является результатом текущего состояния, которое использует это определение делегата:
public delegate T BorrowReader<T>(IDataReader reader);