.Net反射-调用不存在的方法
假设我使用反射在类A上调用方法M1。 该方法不存在 有没有办法在类a上放置一个表示“有人试图执行方法M1”的处理程序 或 是否可以向类动态添加方法?我想添加一个方法M1…Mn,它总是执行MyStaticClass.DoAction(“M1…Mn”) 比如: string methodName=“M1”.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.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?