我可以为方法使用Extension方法吗?

时间:2011-05-23 14:15:22

标签: c# .net

是否可以编写这样的代码?

public void DoSomeOperation().Log()
{

}.Log()

在进入DoSomeOperation方法并退出方法时,上面的调用将执行Log()函数。我能做那样的事吗?我知道我可以在这里使用AOP但不使用AOP,.NET是否会提供这种奢侈品?

4 个答案:

答案 0 :(得分:3)

我错过了什么,或者它不会看起来像这样?

public void DoSomeOperation()
{
    Log();

    // Rest of method body

    Log();
}

如果您要将Log()次调用添加到现有的DoSomeOperation()方法,则可能只是覆盖它,如果它是虚拟的:

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

或者更好的是使用包装器方法并传入相应方法as LukeH suggests的委托。

至于使用Log()调用实际装饰类中的每个方法调用,我不相信C#提供了这样的功能。不管怎样,不是我所知道的。

答案 1 :(得分:3)

LogWrapper(DoSomeOperation);
LogWrapper(() => DoSomeOtherOperation(42));
LogWrapper(() => AndAnother("example"));

// ...

public static void LogWrapper(Action action)
{
    Log();
    action();
    Log();
}

答案 2 :(得分:0)

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

public void DoSomeOperation()
{
    Log();

    // ....

    Log();
}

答案 3 :(得分:0)

我只能推荐你PostSharplogging aspect