按名称调用动态对象上的方法

DLe*_*Leh 3 c# dynamic

我正在尝试围绕动态对象创建一个“包装器”,以便我可以将动态对象上的方法名称与包装类中的方法名称保持一致。

我需要做的是为助手提供一个dynamic对象,以及我想调用它的方法的名称(通过[CallerMemberName]),以及调用的参数。我不知道如何调用动态对象上的调用。我怎样才能做到这一点?

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?
    }
}
Run Code Online (Sandbox Code Playgroud)

DLe*_*Leh 5

事实证明,这毕竟不是那么难。我不知道正常反射是否适用于dynamic类型。我为动态对象找到的所有资源都涉及覆盖TryInvokeMember,这不是一个选项。这里缺少代码:

        var method = ((object)dynamicObject).GetType().GetMethod(methodName);
        method.Invoke(dynamicObject, args);
Run Code Online (Sandbox Code Playgroud)

  • 将任何类型分配给动态属性不会使对象动态化 - 这就是反射在这里起作用的原因。您的解决方案不适用于“动态”对象 - 就像您从 IHubContext 获得的一样。这是你的方法:http://stackoverflow.com/questions/19632587/how-can-i-call-a-dynamically-selected-signalr-client-method-from-an-ihubcontext `var ctx = GlobalHost.ConnectionManager .GetHubContext<MyHub>();``IClientProxy proxy = ctx.Clients.All;``proxy.Invoke(methodName, data);` (2认同)