Вызов метода для динамического объекта по имени

1

Я пытаюсь создать "обертку" вокруг динамического объекта, поэтому я могу сохранить имена методов в динамическом объекте, соответствующие именам методов в классе упаковки.

Что мне нужно сделать, это предоставить помощнику 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?
    }
}
  • 0
    Так зачем вам тогда динамика? Вы можете использовать отражение не так ли?
  • 0
    Это всего лишь образец. Я использую SignalR, который имеет динамические объекты. Я нашел решение, хотя я собираюсь опубликовать.
Теги:
dynamic

1 ответ

4
Лучший ответ

Оказывается, это не так сложно. Я не знал, будет ли нормальное отражение работать с dynamic типами. Все ресурсы, которые я нашел для динамических объектов, включили TryInvokeMember, который не был вариантом. Здесь отсутствует код:

        var method = ((object)dynamicObject).GetType().GetMethod(methodName);
        method.Invoke(dynamicObject, args);
  • 2
    Присвоение любого типа динамическому свойству не делает объект динамическим - вот почему отражение работает здесь. Ваше решение не работает с dynamic объектами - как это вы получаете от IHubContext. Вот как вы это делаете: stackoverflow.com/questions/19632587/… var ctx = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); IClientProxy proxy = ctx.Clients.All; proxy.Invoke(methodName, data);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню