假设我使用反射在A类上调用方法M1。 该方法不存在。
有没有办法在A类上设置一个处理程序,说“有人试图执行方法M1”?
或者
是否可以动态地向类中添加方法?我想添加一个方法M1 ... Mn总是做MyStaticClass.DoAction(“M1 ... Mn”);
类似的东西:
string methodName =“M1”。
A.AddMethod(methodname,x => MyStaticClass.DoAction(x));
答案 0 :(得分:1)
您需要DLR,特别是DynamicObject.TryInvokeMember。实质上,您可以根据需要使用尽可能多的常规成员覆盖DynamicObject,然后提供TryInvokeMember以在运行时处理其他方法调用
答案 1 :(得分:1)
在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);
}
}
关键部分是使用动态作为数据类型。这将标志着它不会尝试在编译时解析方法/属性调用,但在运行时甚至使用您自己的代码。
简化了之前必须完成的整个重构。