.Net反射-调用不存在的方法

.Net反射-调用不存在的方法,.net,reflection,linq-to-objects,.net,Reflection,Linq To Objects,假设我使用反射在类A上调用方法M1。 该方法不存在 有没有办法在类a上放置一个表示“有人试图执行方法M1”的处理程序 或 是否可以向类动态添加方法?我想添加一个方法M1…Mn,它总是执行MyStaticClass.DoAction(“M1…Mn”) 比如: string methodName=“M1” A.AddMethod(methodname,x=>MyStaticClass.DoAction(x)) 特别是,您需要。本质上,您可以使用任意多的常规成员覆盖DynamicObject,然后提供

假设我使用反射在类A上调用方法M1。 该方法不存在

有没有办法在类a上放置一个表示“有人试图执行方法M1”的处理程序

是否可以向类动态添加方法?我想添加一个方法M1…Mn,它总是执行MyStaticClass.DoAction(“M1…Mn”)

比如:

string methodName=“M1”


A.AddMethod(methodname,x=>MyStaticClass.DoAction(x))

特别是,您需要。本质上,您可以使用任意多的常规成员覆盖DynamicObject,然后提供TryInvokeMember在运行时处理其他方法调用

在C#4.0中,实际上有一种非常简单的方法可以做到这一点。。不知道你使用的是什么框架

这应该会给你一个开始。。但请记住,为了确保代码的安全,您必须声明更多

class DynamicTester : DynamicObject
{
    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        Console.WriteLine("Someone is calling method {0}", binder.Name); result = null; return true;
    }
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        Console.WriteLine("Someone is trying to get attribute {0}", binder.Name); result = null; return true;
    }
    public override bool TrySetMember(SetMemberBinder binder, object value) 
    {
        Console.WriteLine("Someone is trying to set attribute {0} to value {1}", binder.Name, Convert.ToString(value)); return true;
    }
}
class Program
{
    static void Main(string[] args)
    {
        dynamic dt = new DynamicTester();
        dt.A = "Test"; dt.B = 14; dt.date = DateTime.Now;
        var i = dt.Z;
        dt.Tester(1, 2, 3);
    }
}
关键部分是使用动态作为数据类型。这将标志着它不会试图在编译时解析方法/属性调用,而是在运行时解析,即使是使用您自己的代码


大大简化了以前必须完成的整个重构。

在c#4中,您可以使用动态对象来完成这项工作,甚至不使用反射。很好,我做到了。是否需要使用VS2010才能使用C#4.0?