我试图创建一个"包装器"围绕一个动态对象,所以我可以保持动态对象上的方法名称与包装类中的方法名称相匹配。
我需要做的是为帮助者提供一个dynamic
对象,以及我想在其上调用的方法的名称(通过[CallerMemberName]
),以及调用的args。我无法弄清楚如何在动态对象上调用调用。我怎么能这样做?
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 :(得分:4)
事实证明,并不是那么难。我不知道正常反射是否适用于dynamic
类型。我找到的动态对象的所有资源都涉及覆盖TryInvokeMember
,这不是一个选项。这是缺少的代码:
var method = ((object)dynamicObject).GetType().GetMethod(methodName);
method.Invoke(dynamicObject, args);