J'aime envoyer une fonction de convertisseur de type générique à une méthode mais je ne sais pas comment le faire.
Voici une syntaxe invalide qui explique ce que j'aime réaliser, le problème est que je ne sais pas comment spécifier le type générique avec mon func:
public void SomeUtility(Func<T><object,T> converter)
{
var myType = converter<MyType>("foo");
}
Edit (voir aussi ma discussion dans les commentaires avec Lawrence): Par "convertisseur de type générique", je voulais dire que je voudrais passer dans un convertisseur qui peut convertir en n'importe quel type fort <T> (pas objet), donc la ligne suivante dans mon La méthode pourrait être:
var myOtherType = converter<MyOtherType>("foo");
Le délégué que j'aime passer comme paramètre ressemblerait à ceci:
private delegate TOutput myConverterDelegate<TOutput>(object objectToConvert);
C'est plus une exploration de syntaxe/C # maintenant, pour faire avancer les choses, j'utiliserai probablement une interface à la place, mais j'espère que cela sera possible avec un func/délégué.
Vous ne pouvez pas avoir d'instances de fonctions ou d'actions génériques - tous les paramètres de type sont définis à l'avance et ne peuvent pas être redéfinis par l'appelant.
Un moyen simple serait d'éviter complètement le polymorphisme en s'appuyant sur la conversion descendante:
public void SomeUtility(Func<Type, object, object> converter)
{
var myType = (MyType)converter(typeof(MyType), "foo");
}
Si vous souhaitez une sécurité de type, vous devez reporter la définition des paramètres de type à l'appelant. Vous pouvez le faire en composant une méthode générique dans une interface:
public void SomeUtility(IConverter converter)
{
var myType = converter.Convert<MyType>("foo");
}
interface IConverter
{
T Convert<T>(object obj);
}
Modifier:
Si le `` type de convertisseur '' est connu sur le site d'appel et que seul ce type sera utilisé à l'intérieur de la méthode utilitaire, vous pouvez définir un type générique sur la méthode et l'utiliser, comme l'ont suggéré d'autres affiches.
public void SomeUtility<T>(Func<object, T> converter)
{
var myType = converter("foo");
}
puis:
SomeUtility(arg => new MyType());
L'inférence de type générique fonctionnera dans ce cas.
Vous devez également rendre SomeUtility
générique. Faire cela et corriger la syntaxe donne:
public void SomeUtility<T>(Func<object,T> converter)
{
var myType = converter("foo");
}
Vous devez connaître le type T au moment de la compilation pour l'utiliser. Le T peut être spécifié au niveau de la classe ou au niveau de la méthode.
class SomeClass<T> {
public void SomeUtility(Func<object, T> converter) {
var myType = converter("foo"); // Already is the T-type that you specified.
}
}
ou
public void SomeUtility<T>(Func<object, T> converter) {
var myType = converter("foo"); // Already is the T-type that you specified.
}