可以给我一个方法的Extension方法吗

本文关键字:方法 一个 Extension | 更新日期: 2023-09-27 17:57:31

有可能写这样的代码吗?

public void DoSomeOperation().Log()
{
}.Log()

在进入DoSomeOperation方法和退出该方法时,上述调用将执行Log()函数。我能做这样的事吗?我知道我可以在这里使用AOP,但如果不使用AOP,.NET会给这种奢侈吗?

可以给我一个方法的Extension方法吗

LogWrapper(DoSomeOperation);
LogWrapper(() => DoSomeOtherOperation(42));
LogWrapper(() => AndAnother("example"));
// ...
public static void LogWrapper(Action action)
{
    Log();
    action();
    Log();
}

我是错过了什么,还是不是看起来像这样?

public void DoSomeOperation()
{
    Log();
    // Rest of method body
    Log();
}

如果您想将Log()调用添加到现有的DoSomeOperation()方法中,那么如果它是虚拟的,您可能只需要像这样覆盖它:

public override void DoSomeOperation()
{
    Log();
    base.DoSomeOperation();
    Log();
}

或者最好使用包装器方法,并按照LukeH的建议传入相应方法的委托。

至于用Log()调用来装饰类中的每个方法调用,我不认为C#提供了这样的功能。无论如何,据我所知,不是这样。

不,这是不可能的。你必须这样写:

public void DoSomeOperation()
{
    Log();
    // ....
    Log();
}

我只能向您推荐PostSharp和日志方面。