Я пытаюсь создать "обертку" вокруг динамического объекта, поэтому я могу сохранить имена методов в динамическом объекте, соответствующие именам методов в классе упаковки.
Что мне нужно сделать, это предоставить помощнику 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?
}
}
Оказывается, это не так сложно. Я не знал, будет ли нормальное отражение работать с 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);