У меня есть тип TestTopicNotificationHandler
, и я sh, чтобы получить атрибуты MessageBusSubscription
, прикрепленные к методу handle любого метода ITopicNotificationHandler <>, который реализован внутри класса.
Там пара сценариев ios:
- Атрибут может не быть прикреплен к каждой реализации интерфейса, как в приведенном ниже случае с
Task Handle(OtherNotification notification)
- Я не хочу искать через имя функции
Handle
, так как в этом случае он будет подбирать Task Handle(bool notAnInterfaceImplementation)
, который на самом деле не является сигнатурой ITopicNotificationHandler - Он также должен игнорировать сигнатуры методов, которые действительны (с точки зрения
ITopicNotificationHandler
), но не определены в списке интерфейсов класса
Как я могу достичь вышеуказанного, пожалуйста, найдите связанную реализацию и вытащите из нее атрибут (без отражения по имени метода), как показано ниже:
var type = typeof(TestTopicNotificationHandler);
var attributes = FindAttributes(type);
// above function call returns the attributes that are defined in the class
// { [MessageBusSubscription("v1\test", QualityOfService.AtMostOnce)], [MessageBusSubscription("v1\yes", QualityOfService.AtMostOnce)]
Если это будет типичная реализация класса:
class TestTopicNotificationHandler : ITopicNotificationHandler<TestTopicNotification>, ITopicNotificationHandler<YesNotification>, ITopicNotificationHandler<OtherNotification>
{
[MessageBusSubscription("v1\test", QualityOfService.AtMostOnce)]
public Task Handle(TestTopicNotification notification)
{
return Task.CompletedTask;
}
[MessageBusSubscription("v1\yes", QualityOfService.AtMostOnce)]
public Task Handle(YesNotification notification)
{
return Task.CompletedTask;
}
// this should be ignored as whilst listed, it does not have an attribute attached
public Task Handle(OtherNotification notification)
{
return Task.CompletedTask;
}
// this should be ignored as whilst valid interface signature, it is not listed in the implementation list of the class
public Task Handle(NonListedNotification notification)
{
return Task.CompletedTask;
}
// this should be ignored it is not an interface
[MessageBusSubscription("invalid", QualityOfService.AtMostOnce)]
public Task Handle(bool notAnInterfaceImplementation)
{
return Task.CompletedTask;
}
}