我有一个IInterceptionBehavior,比如打击:
public class TraceBehavior : IInterceptionBehavior
{
public IEnumerable<Type> GetRequiredInterfaces()
{
return Type.EmptyTypes;
}
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
Console.WriteLine(string.Format("Invoke method:{0}",input.MethodBase.ToString()));
IMethodReturn result = getNext()(input, getNext);
if (result.Exception == null)
{
Console.WriteLine("Invoke successful!");
}
else
{
Console.WriteLine(string.Format("Invoke faild, error: {0}", result.Exception.Message));
result.Exception = null;
}
return result;
}
public bool WillExecute { get { return true; } }
}
无论我是否把它放在方法上,总是抛出异常。有人可以帮帮我吗?
答案 0 :(得分:4)
代码看起来没问题,但是你没有说明如何注册拦截以及如何调用对象。
假设正在调用拦截,那么如果我猜测调用的方法会返回一个值类型而IMethodReturn.ReturnValue
为null,这会导致NullReferenceException
。
如果是这种情况,那么可能返回值类型的默认值将解决您的问题:
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
Console.WriteLine(string.Format("Invoke method:{0}", input.MethodBase.ToString()));
IMethodReturn result = getNext()(input, getNext);
if (result.Exception == null)
{
Console.WriteLine("Invoke successful!");
}
else
{
Console.WriteLine(string.Format("Invoke faild, error: {0}", result.Exception.Message));
result.Exception = null;
Type type = ((MethodInfo)input.MethodBase).ReturnType;
if (type.IsValueType)
{
result.ReturnValue = Activator.CreateInstance(type);
}
}
return result;
}