Нет встроенного способа сделать это в .NET.
Если вы хотите , а не , чтобы использовать какие-либо сторонние библиотеки (как вы сказали в одном из ваших комментариев),выполнение ткачества кода или генерация динамического прокси - это большая работа.В этом случае лучше отказаться от использования атрибутов и использовать шаблон проектирования декоратора.Вот пример:
// Define an interface for the operation
public interface IMyLongRunningTask
{
DBResult longTask(DBCommand command);
}
// Define an implementation for the operation:
public class MyLongRunningTask : IMyLongRunningTask
{
public DBResult longTask(DBCommand command)
{
// code here
}
}
И теперь вы можете написать декоратор для IMyLongRunningTask:
public class MyLongRunningTaskMonitor : IMyLongRunningTask
{
private readonly IMyLongRunningTask wrappedService;
private readonly ILogger logger;
public MyLongRunningTaskMonitor(IMyLongRunningTask wrapped,
ILogger logger)
{
this.wrappedService = wrapped;
this.logger = logger;
}
public DBResult longTask(DBCommand command)
{
var watch = Stopwatch.CreateNew();
var result = this.wrappedService.longTask(command);
this.logger.Log("longTask executed in " +
watch.ElapsedMilliseconds + " ms.");
return result;
}
}
Когда вы используете внедрение зависимостей, вы можете легко настроить MyLongRunningTaskMonitor
для возвратакогда запрашивается IMyLongRunningTask
.Например:
container.Register<IMyLongRunningTask>(() =>
new MyLongRunningTaskMonitor(
container.GetInstance<MyLongRunningTask>(),
container.GetInstance<ILogger>()
)
);