执行前对方法参数强制 属性(使用 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) { /* ... */ }
你有两个选择 - 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);
}
}
我有这样的方法
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) { /* ... */ }
你有两个选择 - 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);
}
}