通过名称在动态对象上调用方法

3
我正在尝试创建一个动态对象的“包装器”,以便我可以保持动态对象上的方法名称与封装类中的方法名称匹配。
我需要做的是向助手提供一个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?
    }
}

那么为什么你需要动态语言呢?你不是可以使用反射吗? - Sriram Sakthivel
这只是一个示例。我正在使用具有动态对象的SignalR。不过,我找到了一个解决方案,我将要发布它。 - DLeh
1个回答

5
原来这并不难。我不知道普通的反射是否适用于动态类型。我发现所有关于动态对象的资料都涉及到重写TryInvokeMember,但这并不是一个选项。以下是缺失的代码:
var method = ((object)dynamicObject).GetType().GetMethod(methodName);
method.Invoke(dynamicObject, args);

2
将任何类型分配给动态属性并不会使对象动态 - 这就是为什么反射在这里起作用的原因。您的解决方案无法在 dynamic 对象上工作 - 就像您从 IHubContext 中获取的对象一样。以下是如何操作的:https://dev59.com/6mIk5IYBdhLWcg3wDaQWvar ctx = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); IClientProxy proxy = ctx.Clients.All; proxy.Invoke(methodName, data); - mcs_dodo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接