我可以使用反射来查找多播产生的方面吗?
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 )]
我有一个案例,其中 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 )]