PostSharp: метод *** должен быть аннотирован пользовательским атрибутом селектора, потому что он является главным обработчиком - PullRequest
1 голос
/ 24 апреля 2019

Ошибка выброса этого кода: Method ...OnEntry(...) should be annotated with a selector custom attribute because it is a master handler.

[PSerializable]
public class LogRequestAttribute : MethodLevelAspect, IAspectProvider {
    public IEnumerable<AspectInstance> ProvideAspects(object target) {
        yield return new AspectInstance( target, new LogPlainRequest() );
    }
}

[PSerializable]
public class LogPlainRequest : IMethodLevelAspect {
    public void RuntimeInitialize(MethodBase method) {
    }
    [OnMethodEntryAdvice]
    public void OnEntry(MethodExecutionArgs args) {
    }
}

Что означает ошибка? А что не так?

1 Ответ

1 голос
/ 26 апреля 2019

Вы можете объединить несколько советов в одну группу (например, OnEntry, OnExit).Это то, что OnMethodBoundaryAspect делает для вас автоматически.После того, как вы сгруппировали советы, вы должны обозначить одно из них как «основной совет».Свойства и pointcut группы должны быть установлены в основной рекомендации.

Точка, назначенная основной рекомендации, действует как селектор целевого элемента рекомендации.Например, SelfPointcut просто выбирает цель аспекта в качестве цели рекомендации.Вы можете найти дополнительную информацию и различные виды точек в документах: https://doc.postsharp.net/advices

В приведенном выше примере вы можете применить атрибут [SelfPointcut] к методу OnEntry, чтобы избавиться от сообщения об ошибке.

[PSerializable]
public class LogPlainRequest : IMethodLevelAspect {
    public void RuntimeInitialize(MethodBase method) {
    }

    [OnMethodEntryAdvice]
    [SelfPointcut]
    public void OnEntry(MethodExecutionArgs args) {
    }
}
...