我可以在运行另一个方面之前动态生成一个方面吗?

时间:2015-11-11 16:28:16

标签: postsharp

我会尝试用尽可能少的细节来解释这个问题,以保持简短的问题。如果需要更多详细信息,请与我们联系。

我在属性A上有一个方面X,它在属性B上动态生成一个方面Y.属性B可能已经包含Y类方面,它们相互交互并生成Y的实例。

我要求X生成的Y的实例在运行非生成的Y实例之前出现。使用AspectDependencies我无法完成这项工作。我放置了一个AspectDependencyPosition。

我放在X上的方面依赖关系是以下形式: [AspectTypeDependency(AspectDependencyAction.Order,AspectDependencyPosition.Before,typeof(Y))]

我得到的执行顺序是: SourceInstanceOfY,X,GeneratedInstanceOfY

虽然我需要的执行顺序是: X,SourceInstanceOfY,GeneratedInstanceOfY 最后两个可能会改变顺序。

有没有办法解决这个问题,或者PostSharp不支持它?

谢谢, 雷米。

1 个答案:

答案 0 :(得分:1)

By using AspectTypeDependency you specified the ordering between aspects X and Y, but the order for Y instances is still not specified. You can use the ApectPriority property to order individual instances of the Y aspect. You can find the simple example based on your description below:

class TestClass
{
    [MyAspectX]
    public int PropertyA { get; set; }

    [MyAspectY("from attribute", AspectPriority = 2)]
    public int PropertyB { get; set; }
}

[Serializable]
public class MyAspectX : LocationInterceptionAspect, IAspectProvider
{
    public override void OnGetValue(LocationInterceptionArgs args)
    {
        Console.WriteLine("X OnGetValue");
        base.OnGetValue(args);
    }

    public IEnumerable<AspectInstance> ProvideAspects(object targetElement)
    {
        yield return new AspectInstance(
            ((LocationInfo) targetElement).DeclaringType.GetProperty("PropertyB"),
            new MyAspectY("from provider") {AspectPriority = 1});
    }
}

[Serializable]
public class MyAspectY : LocationInterceptionAspect
{
    private string tag;

    public MyAspectY(string tag)
    {
        this.tag = tag;
    }

    public override void OnGetValue(LocationInterceptionArgs args)
    {
        Console.WriteLine("Y OnGetValue " + tag);
        base.OnGetValue(args);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(new TestClass().PropertyB);
    }
}