Les délégués avec la valeur de retour l'inférence de type (C#)

Je suis encore nouveau pour les délégués et j'ai été jouer avec la fonction de Délégué Couche d'Accès aux Données décrites dans Steven John Metsker "Patrons de Conception en C#" livre (excellent!). Il définit les données d'accès délégué comme ceci:

public delegate object BorrowReader(IDataReader reader);

Le résultat de l'utilisation de ce code qui ressemble à l'un de ces:

var result = Foo.Bar(new BorrowReader(DoFooBarMagic));
var result = Foo.Bar(DoFooBarMagic);

Cependant, depuis le délégué du type de retour est "objet", vous devez effectuer un cast pour obtenir quelle que soit la méthode ("DoFooBarMagic" dans cet exemple) retourne vraiment. Donc, si "DoFooBarMagic" retourne la Liste, vous devez faire quelque chose comme ceci:

var result = Foo.Bar(DoFooBarMagic) as List<string>;

Ce que j'aimerais c'est être capable de sauter le casting et avoir le type de retour de la délégué déduit du type de retour de la méthode du délégué. Je pensais peut-être il y a un moyen d'utiliser un paramètre de Type d'inférence du type de retour. Quelque chose comme un de ces:

public delegate T BorrowReader<T>(IDataReader reader);
List<string> result = Foo.Bar(new BorrowReader(DoFooBarMagic)); 
//Look, Ma, no cast!
var result2 = Foo.Bar(DoFooBarMagic);

Où le type de retour est déduit à partir du type de retour de la méthode du délégué, mais qui s'avère ne pas fonctionner. Au lieu de cela vous avez à faire cela:

public delegate T BorrowReader<T>(IDataReader reader);
var result = Foo.Bar(new BorrowReader<List<string>>(DoFooBarMagic));

Qui ne semble guère mieux que la fonte.

Donc, il y a un moyen de déduire le type de retour de la déléguée du type de retour de la méthode du délégué?

Modifier pour Ajouter:
Je peux changer la signature de Foo.Bar en cas de besoin. La signature actuelle est essentiellement ceci:

public static T Bar<T>(string sprocName,
                       DbParameter[] params, 
                       BorrowReader<T> borrower);

Remarque: cette signature est le résultat de l'état actuel, qui est à l'aide de ce délégué définition:

public delegate T BorrowReader<T>(IDataReader reader);

OriginalL'auteur Josh | 2009-05-12