我可以使用反射来查找多播产生的方面吗?

Can I use reflection to find aspects produced by multicast?

我有一个案例,其中 class A 上的方面 CanBeDependedUpon 被多播到 class A 的属性。但是,当从方面 DependsOn 检查 class A 时,我没有找到Y 的属性上的 CanBeDependedUpon。这是正确的 PostSharp 行为吗?

[CanBeDependedUpon]
class A
{
    public bool Foo
    {
        get;
        set;
    }

    [DependsOn("Foo")]
    public bool Bar
    {
        get;
        set;
    }
}

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property, AllowMultiple = true)]
[MulticastAttributeUsage(MulticastTargets.Class | MulticastTargets.Struct | MulticastTargets.Property, PersistMetaData = true, AllowMultiple = true)]
class CanBeDependedUpon : Aspect
{
}

class DependsOn : Aspect
{
    private string _target;

    public DependsOn(string target)
    {
        _target = target;
    }

    public override bool CompileTimeValidate(object target)
    {
        //validate that the target property exists and is annotated with X.
        return base.CompileTimeValidate(target);
    }
}

默认情况下,一旦将方面应用到您的代码,PostSharp 就会删除该属性。如果您想使用反射查找属性,您可以明确指示 PostSharp 保留这些属性。

为此,您需要将 MulticastAttributeUsage 属性应用到 class 并将 PersistMetaData 设置为 true

[MulticastAttributeUsage( MulticastTargets.Class, PersistMetaData = true )]

此用例记录在此处:http://doc.postsharp.net/multicast-reflection