2014-07-24 2 views
1

J'essaye de créer un "wrapper" autour d'un objet dynamique afin que je puisse conserver les noms de méthode sur un objet dynamique correspondant aux noms des méthodes de la classe d'habillage. Ce que je dois faire est de fournir à l'assistant un objet dynamic, et le nom de la méthode que je veux appeler (via [CallerMemberName]), et les args pour l'appel. Je ne peux pas comprendre comment appeler l'appel sur l'objet dynamique. Comment puis-je faire ceci?Appeler une méthode sur un objet dynamique par son nom

class Program 
{ 
    static void Main(string[] args) 
    { 
     var dyn = new ClassWithDynamicProperty(); 
     dyn.SendMessage("test"); 
     Console.ReadKey(); 
    } 
} 

public class ExampleDynamicClass 
{ 
    public void SendMessage(string msg) 
    { 
     Console.WriteLine(msg); 
    } 
} 

public class ClassWithDynamicProperty 
{ 
    public ClassWithDynamicProperty() 
    { 
     MyDynObject = new ExampleDynamicClass(); 
    } 

    public dynamic MyDynObject { get; set; } 

    public void SendMessage(string theMessage) 
    { 
     //i want to replace this: 
     MyDynObject.SendMessage(theMessage); 
     //with this: 
     DynamicHelper.CallDynamic(MyDynObject, new object[] { theMessage }); 
    } 
} 

public static class DynamicHelper 
{ 
    public static void CallDynamic(dynamic source, object[] args, [CallerMemberName]string methodName = null) 
    { 
     //source.methodName(args); How can i invoke this? 
    } 
} 
+0

Alors pourquoi avez-vous besoin de dynamique alors? Vous pouvez utiliser la réflexion n'est-ce pas? –

+0

Ceci est juste un échantillon. J'utilise SignalR qui a des objets dynamiques. J'ai trouvé une solution mais je suis sur le point de poster. – DLeh

Répondre

4

Il s'avère que ce n'est pas si difficile après tout. Je ne savais pas si la réflexion normale fonctionnerait avec dynamic types. Toutes les ressources que j'ai trouvées pour les objets dynamiques impliqués remplacent TryInvokeMember, ce qui n'était pas une option. Voici le code manquant:

 var method = ((object)dynamicObject).GetType().GetMethod(methodName); 
     method.Invoke(dynamicObject, args); 
+1

Affecter n'importe quel type à une propriété dynamique ne rend pas l'objet dynamique - c'est pourquoi la réflexion fonctionne ici. Votre solution ne fonctionne pas sur les objets 'dynamic' - comme ceux que vous obtenez de IHubContext. Voici comment vous le faites: http://stackoverflow.com/questions/19632587/how-can-i-call-a-dynamically-selected-signalr-client-method-from-an-ihubcontext 'var ctx = GlobalHost.ConnectionManager.GetHubContext (); ' ' proxy IClientProxy = ctx.Clients.All; ' ' proxy.Invoke (nomMéthode, données); ' –

Questions connexes