我试图通过代理班拦截一种方法,正在获得“目标与目标类型不符”的“目标”。 我认为,这与《沙普协议》这样的框架相似,但我想看到,我能否至少做事。
本案的目标是利用诊断方法使用这种方法。 停止监视,在新任代表中总结。 然而,它却超越了我的头部。
代表在此总结近似方法:
public static Func<Object> Time(this MethodInfo target, object parent, object[] parameters, Action<string> logger)
{
return delegate
{
Stopwatch s = new Stopwatch();
s.Start();
object value = target.Invoke(parent, parameters);
s.Stop();
logger("Elapsed ms for function " + target.Name + " = " + s.ElapsedMilliseconds.ToString());
return value;
};
}
那么,这里是一种拦截方法,主要是建立一个新的方法信息案例,说明在此设立的新代表,其依据是,方法是否具有某种特性,表明应当有时间:
public class FunctionInterceptor
{
public MethodInfo Intercept(Object proxy, MethodInfo method, Object[] args)
{
return new Func<Object>(() =>
{
var data = method.GetCustomAttributes(typeof(TimeAttribute), true);
object result = default(object);
foreach (object d in data)
{
if (d.GetType() == typeof(TimeAttribute)) // [Time] attribute
{
result = method.Time(proxy, args, Log.Write).DynamicInvoke(args);
}
}
return result;
}).Method; // returning MethodInfo of this delegate
}
Now it seems to me I should be able to invoke the delegate that this MethodInfo object describes:
var interceptor = new FunctionInterceptor();
retVal = interceptor.Intercept(proxy, method, parameters).Invoke(interceptor, parameters);
But I am getting the error - Object does not match target type. I examined the MethodInfo instance and the DeclaringType is FunctionInterceptor, meaning I should be passing in the instance of the interceptor as above. Not sure what the problem is.
如果我这样做的话,它会做一些细微的工作(在不作总结的情况下援引“方法”):
retVal = method.Invoke( obj, parameters );
如果是宣布相关方法的,则与[时间]属性有关。
感谢。