【问题标题】:Call a method on a dynamic object by name按名称调用动态对象的方法
【发布时间】:2022-04-22 00:47:57
【问题描述】:

我正在尝试围绕动态对象创建一个“包装器”,这样我就可以使动态对象上的方法名称与包装类中的方法名称相匹配。

我需要做的是为帮助程序提供一个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?
    }
}

【问题讨论】:

  • 那么为什么需要动态呢?你可以使用反射不是吗?
  • 这只是一个示例。我正在使用具有动态对象的 SignalR。尽管我即将发布,但我找到了一个解决方案。

标签: c# dynamic


【解决方案1】:

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

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

【讨论】:

  • 将任何类型分配给动态属性不会使对象动态 - 这就是反射在这里起作用的原因。您的解决方案不适用于 dynamic 对象 - 就像您从 IHubContext 获得的这些。操作方法如下:stackoverflow.com/questions/19632587/…var ctx = GlobalHost.ConnectionManager.GetHubContext<MyHub>();IClientProxy proxy = ctx.Clients.All;proxy.Invoke(methodName, data);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2011-08-26
  • 2012-08-04
  • 1970-01-01
  • 2017-03-30
  • 2012-02-16
  • 2021-05-28
相关资源
最近更新 更多