3

我有一个MethodInterceptionAspect(PostSharp)的实现, 但是当我在覆盖OnInvoke方法中时,它args.Method是空的,我需要知道方法返回值类型,

有人知道吗?

[PSerializable]
public class PSHandleRequestAttribute : MethodInterceptionAspect
{
    public PSHandleRequestAttribute(bool readOnly = true) : base()
    {
        ReadOnly = readOnly;
    }

    #region Properties

    protected bool ReadOnly { get; set; }

    #endregion Properties

    #region Public Methods

    public override void OnInvoke(MethodInterceptionArgs args)
    {
        var instance = args.Instance as IBusinessTransaction;
        var method = args.Method;
        if (instance.IsNull())
        {
            throw new Exception("Use PSHandleRequestAttribute only for IBusinessTransaction");
        }

        instance.OpenTransaction();

        try
        {
            args.Proceed();
            //base.OnInvoke(args);
            instance.CommitTransaction();
            return;
        }
        catch (Exception ex)
        {
            var errorMessage = instance.RollbackTransaction(ex);

            return;
        }
    }

    #endregion Public Methods
}
4

1 回答 1

1

PostSharp 会优化生成的代码,因此当args.Method任何地方都没有使用 的值时,优化器会跳过一些操作并将 null 作为值传递。

在代码中使用该值后,该值应该会出现。

我还建议您在CompileTimeValidate方法中进行使用验证并发出构建时错误消息。这样,您将在构建时发现可能的错误。请参阅http://doc.postsharp.net/aspect-validation

于 2017-03-29T12:38:45.627 回答