2017-09-01 12 views
0

Supposons que j'ai une classe de base comme leUtilisation de l'appel arbre d'expression d'une méthode avec le même nom sur 2 classes sans rapport avec

suivant
public abstract class BaseHelloWorld<T> where T : BaseEntity 
{ 
    public abstract IEnumerable<T> DoSomething(); 
} 

et un autre comme

public class BaseEntity 
{ 
    public abstract void DoSomethingInPayload(); 
} 

J'ai 4 classes comme:

public class Payload1 : BaseEntity 
{ 
    public override void DoSomethingInPayload() 
    { 
     Console.Write("Hello world"); 
    } 
} 

public class Class1 : BaseHelloWorld<Payload1> 
{ 
    public override IEnumerable<Payload1> DoSomething() 
    { 
     return new List<Payload1> { }; 
    } 
} 

public class Payload2 : BaseEntity 
{ 
    public override void DoSomethingInPayload() 
    { 
     Console.Write("Goodbye world"); 
    } 
} 

public class Class2 : BaseHelloWorld<Payload2> 
{ 
    public override IEnumerable<Payload2> DoSomething() 
    { 
     return new List<Payload2>() { }; 
    } 
} 

Bien que j'aie montré du code ici, supposons que ceux-ci soient des bibliothèques tierces que je n'ai pas pour et je veux les prolonger. Ce que je veux faire est d'être en mesure de créer une seule méthode d'extension qui me permettra d'appeler la méthode DoSomethingInPayload() de la classe de charge utile similaire à

public static void CallDoSomething<T>(this BaseHelloWorld<T> theClass) where T: BaseEntity 
{ 
    theClass.DoSomethingInPayload(); 
} 

Évidemment, cela ne fonctionne pas, je commencé à chercher si à l'expression des arbres. Ma lecture suggère qu'il est possible de faire avec des arbres d'expression, mais je ne peux pas le comprendre. Après des heures d'essais et d'aller nulle part, je ne suis pas sûr que ma théorie soit correcte. Par conséquent pouvez-vous me dire s'il vous plaît:

A) Est-il possible de le faire avec des arbres d'expression B) Si oui, comment le ferais-je?

Merci à l'avance

+3

Que diriez-vous 'IEnumerable CallDoSomething (ce BaseHelloWorld theClass) '? –

+0

C'est possible, mais pourquoi les arbres d'expression (ou de réflexion) - 'dynamic' sont juste pour cela, par ex. 'return ((theClass) theClass) .DoSomething();' –

+0

car vous ne pouvez pas utiliser dynamique comme le premier paramètre dans les méthodes d'extension – John

Répondre

1

Votre propre exemple ne fonctionne pas parce que T est un autre type dans l'entrée et le retour des paramètres.

En effet, comme mentionné @AleksAdreev, vous pouvez simplement essayer:

public static IEnumerable<T> CallDoSomething<T>(this BaseHelloWorld<T> theClass) 
{ 
    return theClass.DoSomething(); 
} 

qui peut alors être appelé comme suit:

var someClass = new Class2(); 
var someResult = someClass.CallDoSomething(); 
+0

J'ai essayé de donner une démonstration triviale dans mon exemple qui aurait pu être corrigé par la solution @AleksAdreev. Mon exemple dans le monde réel est très complexe et je n'ai pas tout le code source, donc c'était ma tentative de démonstration.J'ai mis à jour la question pour montrer le problème que je rencontre – John

+1

@John Et pourquoi cela ne fonctionnerait-il pas? Ajoutez simplement la contrainte requise: 'where T: BaseEntity' – InBetween

+0

Parce que dans ma hâte de corriger la question, j'ai fait une erreur dans l'exemple. Je suis vraiment désolé de ce que je vais le corriger :( – John