在c#中,是否可以为方法添加注释,这些注释可以在方法运行之前、期间和发生错误时执行

本文关键字:方法 注释 执行 错误 是否 添加 运行 | 更新日期: 2023-09-27 18:03:24

我认为,如果可能的话,将日志记录细节移到方法之外会很好。我的第一个想法是想知道这是否可以通过注释或属性来实现。例如

[LogBeforeRunning("Foo is about to be run.")]
[LogAfterRunning("Foo has been run.")]
[LogOnError("Foo ran into some errors while running.")]
public void Foo() 
{
    //do something
}

我知道ASP。. NET MVC框架有这样的东西,但我不知道这需要多少布线设置。另一个值得问的问题是,这真的有价值吗?我认为它会,但是日志记录不会有相关的变量信息,所以我仍然需要比这更详细的信息。

但是,一个人会怎么做这样的事情呢?我想知道这是否可能。

在c#中,是否可以为方法添加注释,这些注释可以在方法运行之前、期间和发生错误时执行

不,这不是属性的作用。它们在加载程序集时求值,您无法知道何时发生这种情况。它是相对不可靠的。程序集可以提前加载(甚至在程序启动时),也可以不加载(延迟加载)。当它们之间没有引用时,甚至加载顺序也可能不可预测。

最好是不依赖于汇编加载时间和顺序。对于AOP来说,没有当前的语言结构,但是可以使用一些扩展。

在类似的情况下,我所做的是实现这样的执行模式:

public static class AOP
{
    public static void Execute(Action f)
    {
        // check if f has a LogBeforeRunning attribute and log the text
        try
        {
            f();
        }
        catch
        {
            // check if f has a LogOnError attribute and log the text
        }
        // check if f has a LogAfterRunning attribute and log the text
    }
    public static void Execute<T>(Action<T> f, T arg)
    {
        // check if f has a LogBeforeRunning attribute and log the text
        try
        {
            f(arg);
        }
        catch
        {
            // check if f has a LogOnError attribute and log the text
        }
        // check if f has a LogAfterRunning attribute and log the text
    }
    public static void Execute<T1, T2>(Action<T1, T2> f, T1 arg1, T2 arg2)
    {
        // check if f has a LogBeforeRunning attribute and log the text
        try
        {
            f(arg1, arg2);
        }
        catch
        {
            // check if f has a LogOnError attribute and log the text
        }
        // check if f has a LogAfterRunning attribute and log the text
    }
    // more Execute() methods for arity 3, 4, 5, ...
}

遗憾的是,没有任意的整数泛型,所以你必须为每个整数(0,1,2,3,…)定义一个Execute()方法。

然后运行

f(1, 2, 3, 4);

:

AOP.Execute(f, 1, 2, 3, 4);