我有这样的方法
public void MyMethod(MyType parameter) { /* ... */ }
我希望在方法获胜之前强制将值放入parameter
的公共属性中。
必须在方法执行之前发生,因为某些postSharp OnMethodBoundaryAspect.OnEntry
取决于此属性的值。
理想的解决方案可能如下所示:
[SetPropertyBeforeEntry(0 /* Argument's index*/, nameof(MyType.MyProperty) /* Property to set */, 1234 /* Value */)]
public void MyMethod(MyType parameter) { /* ... */ }
答案 0 :(得分:1)
您有两个选项 - OnMethodBoundaryAspect
和MethodInterceptionAspect
,但在这两种情况下,您都需要使用方面依赖关系以确保订单正确(如果未指定订单,PostSharp会产生警告)。
PostSharp提供了各种方法来指定方面之间的依赖关系。你可以find more here。
以下演示了之前参数属性的更改(没有参数类型,属性或索引的特定逻辑。
class Program
{
static void Main(string[] args)
{
new TestClass().Foo(new TestData());
}
}
public class TestClass
{
[ObservingAspect]
[ArgumentChangingAspect]
public int Foo(TestData data)
{
Console.WriteLine("Method observed: {0}", data.Property);
return data.Property;
}
}
public class TestData
{
public int Property { get; set; }
}
[AspectTypeDependency(AspectDependencyAction.Order, AspectDependencyPosition.Before, typeof(ObservingAspect))]
[PSerializable]
public class ArgumentChangingAspect : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
((TestData) args.Arguments[0]).Property = 42;
}
}
[PSerializable]
public class ObservingAspect : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
Console.WriteLine("Aspect observed: {0}", ((TestData)args.Arguments[0]).Property);
}
}