2009-02-25 8 views
1

Comment puis-je compiler le code suivant?Délégué générique ou problème de moulage générique

Action<MyClass<object, object>> func = x => Console.WriteLine(x.ToString()); 

    public void Apply<T1, T2>(MyClass<T1, T2> target) 
    { 
     func.Invoke(target); 
    } 

Je sais cela ne fonctionne pas parce qu'un MyClass < T1, T2 > nest pas un objet MyClass <, objet >, mais ce que je peux faire?

Puis-je rendre la fonction générique? ou Puis-je lancer une cible?

de toute façon, comment?

Si cela aide, rien dans le func ne fera jamais quoi que ce soit de spécifique T1 ou T2. Je sais que cette hypothèse pourrait la rendre fragile, mais les tests unitaires devraient permettre de détecter les problèmes. Editer: J'évite le problème en ce moment avec des charges d'interfaces vides que je préférerais faire disparaître!

Merci

Répondre

10

Eh bien, une option est d'écrire une méthode générique pour renvoyer le type de fonction:

public void Apply<T1, T2>(MyClass<T1, T2> target) 
{ 
    GetFunc<T1,T2>().Invoke(target); 
} 

private Action<MyClass<T1,T2>> GetFunc() 
{ 
    return x => Console.WriteLine(x.ToString()); 
} 

Alternativement, si vous voulez vraiment être en mesure de déclarer « Je peux travailler avec toute action MyClass ", je vous suggère de créer un type non générique MyClass, et faire MyClass<T1,T2> en tirer:

public class MyClass 
{ 
    // Put common stuff in here 
} 

public class MyClass<T1, T2> : MyClass 
{ 
    // Put stuff using T1 and T2 here 
} 

T Si vous pouvez simplement utiliser un Action<MyClass> à la place.

+0

doh, méthode générique bien sûr! Je déteste le codage tard la nuit! à votre santé –

0

Dans le cas particulier que vous avez mentionné, vous devez simplement modifier Action> Action, car vous n'utilisez aucune méthode particulière à 'MyClass'. Si vous souhaitez utiliser des méthodes propres à 'MyClass' qui ne dépendent pas des types génériques, vous devez définir une classe de base contenant ces méthodes, en extraire MyClass et utiliser le type de base comme type d'argument pour le délégué.

Si vous souhaitez utiliser des méthodes particulières à 'MyClass' qui dépendent des types génériques, vous devez créer un délégué avec les types corrects lors de l'appel.

Questions connexes