PostSharp - args.ReturnValye =默认(T) - > T =方法返回类型,如何?

时间:2017-01-25 15:28:06

标签: return-type postsharp

我的方面:

class ProgressPercentage(object):
    def __init__(self, client, bucket, filename):
        # ... everything else the same
        self._size = client.head_object(Bucket=bucket, Key=filename).ContentLength

    # ...

# If you still have the client object you could pass that directly 
# instead of transfer._manager._client
progress = ProgressPercentage(transfer._manager._client, BUCKET_NAME, FILE_NAME)
transfer.download_file(..., callback=progress)

基本上,ProgramState.State()方法检查程序是否正在运行(true),暂停(isPaused == true时循环),停止(false),这应该控制if方法是否可以运行(基本上是一个开始)暂停/恢复停止的事情)

但有时我从方法返回时会得到nullreferences。

我有兴趣知道如何将返回类型设置为方法的默认返回类型。

2 个答案:

答案 0 :(得分:0)

您可以使用表示方法返回类型的泛型参数使方面类具有通用性。然后,您需要创建一个方法级属性,该属性也是一个方面提供者。该属性将应用于用户代码,反过来它可以提供通用方面的正确实例。

[Serializable]
[MulticastAttributeUsage( MulticastTargets.Method )]
public class FlowControllerAttribute : MethodLevelAspect, IAspectProvider
{
    public IEnumerable<AspectInstance> ProvideAspects(object targetElement)
    {
        MethodInfo method = (MethodInfo) targetElement;

        Type returnType = method.ReturnType == typeof(void)
            ? typeof(object)
            : method.ReturnType;

        IAspect aspect = (IAspect) Activator.CreateInstance(typeof(FlowControllerAspect<>).MakeGenericType(returnType));

        yield return new AspectInstance(targetElement, aspect);
    }
}

[Serializable]
public class FlowControllerAspect<T> : IOnMethodBoundaryAspect
{
    public void RuntimeInitialize(MethodBase method)
    {
    }

    public void OnEntry(MethodExecutionArgs args)
    {
        args.ReturnValue = default(T);
        args.FlowBehavior = FlowBehavior.Return;
    }

    public void OnExit(MethodExecutionArgs args)
    {
    }

    public void OnSuccess(MethodExecutionArgs args)
    {
    }

    public void OnException(MethodExecutionArgs args)
    {
    }
}

// Usage:
[FlowController]
public int Method()
{
    // ...
}

答案 1 :(得分:0)

已通过PostSharp 6.0.29测试

在使用它之前,请检查所需的空控件。
如果方法是异步任务

 public override void OnException(MethodExecutionArgs args)
    {
        var methodReturnType = ((System.Reflection.MethodInfo)args.Method).ReturnType;
        var runtime = methodReturnType.GetRuntimeFields().FirstOrDefault(f => f.Name.Equals("m_result"));

        //Only if return type has parameterless constructture (should be check before create)
        var returnValue = Activator.CreateInstance(runtime.FieldType);

        args.ReturnValue = returnValue;
    }

如果方法不是异步

 public override void OnException(MethodExecutionArgs args)
    {
        var methodReturnType = ((System.Reflection.MethodInfo)args.Method).ReturnType;

        //Only if return type has parameterless constructture (should be check before create)
        var returnValue = Activator.CreateInstance(methodReturnType);

        args.ReturnValue = returnValue;
    }