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

Force property on method parameter before excecution (using PostSharp?)

我有这样的方法

public void MyMethod(MyType parameter) { /* ... */ }

我想在执行该方法之前将一个值强制为 parameter 的 public 属性 之一。 它必须在方法执行之前发生,因为某些 postSharp OnMethodBoundaryAspect.OnEntry 取决于此 属性 的值。

理想的解决方案如下所示:

[SetPropertyBeforeEntry(0 /*  Argument's index*/, nameof(MyType.MyProperty) /* Property to set */, 1234 /* Value */)]
public void MyMethod(MyType parameter) { /* ... */ }

你有两个选择 - 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);
    }
}