在执行之前对方法参数强制属性(使用PostSharp?)

时间:2017-03-16 08:42:08

标签: c# postsharp

我有这样的方法

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) { /* ... */ }

1 个答案:

答案 0 :(得分:1)

您有两个选项 - OnMethodBoundaryAspectMethodInterceptionAspect,但在这两种情况下,您都需要使用方面依赖关系以确保订单正确(如果未指定订单,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);
    }
}