C# 我可以有一个扩展方法吗?

C# 我可以有一个扩展方法吗?,c#,.net,C#,.net,可以这样写代码吗 public void DoSomeOperation().Log() { }.Log() public void DoSomeOperation() { Log(); // Rest of method body Log(); } 上述调用将在输入DoSomeOperation方法和退出该方法时执行Log()函数。我可以这样做吗?我知道我可以在这里使用AOP,但如果不使用AOP,.NET是否提供了这种奢华?我是否遗漏了一些东西,或者只是看起来

可以这样写代码吗

public void DoSomeOperation().Log()
{

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

    // Rest of method body

    Log();
}

上述调用将在输入DoSomeOperation方法和退出该方法时执行Log()函数。我可以这样做吗?我知道我可以在这里使用AOP,但如果不使用AOP,.NET是否提供了这种奢华?

我是否遗漏了一些东西,或者只是看起来像这样

public void DoSomeOperation().Log()
{

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

    // Rest of method body

    Log();
}
如果您想将
Log()
调用添加到现有的
DoSomeOperation()
方法,如果它是虚拟的,您可以这样重写它:

public override void DoSomeOperation()
{
    Log();
    base.DoSomeOperation();
    Log();
}
或者最好使用包装器方法并传入相应方法的委托


至于用
Log()
调用实际修饰类中的每个方法调用,我不相信C#提供了这样的特性。无论如何,据我所知不是这样。

我是遗漏了什么,还是只是看起来像这样

public void DoSomeOperation().Log()
{

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

    // Rest of method body

    Log();
}
如果您想将
Log()
调用添加到现有的
DoSomeOperation()
方法,如果它是虚拟的,您可以这样重写它:

public override void DoSomeOperation()
{
    Log();
    base.DoSomeOperation();
    Log();
}
或者最好使用包装器方法并传入相应方法的委托


至于用
Log()
调用实际修饰类中的每个方法调用,我不相信C#提供了这样的特性。无论如何,据我所知不是这样。

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

public void DoSomeOperation()
{
    Log();

    // ....

    Log();
}

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

public void DoSomeOperation()
{
    Log();

    // ....

    Log();
}

我只能推荐您和。

我只能推荐您和。

当然会,但是如果我可以编写不同的方法,那么我就不必在方法中添加日志语句。另外,如果我可以在类级别指定一个公共日志函数,那么所有方法都将执行它,而无需我在每个方法中都指定它。当然会,但是如果我可以编写不同的函数,那么我就不必在方法中添加日志语句。另外,如果我可以在类级别指定一个公共日志函数,那么所有方法都将执行它,而无需在每个方法中指定它。扩展方法由变量的类型定义连接。由于您的方法返回void,而不是具体的类型,因此无法执行此操作。请始终记住,将扩展方法视为编写以变量作为参数的静态帮助器方法的语法糖。Ok。如果我在这里返回bool,是否可以这样做?当然,您可以有一个带有静态bool MyExtensionMethod签名的扩展方法(这个bool some_参数_name)。您可以使用Autofac的TypeInterceptor,或者从ContextBoundObject派生。扩展方法由变量的类型定义连接。由于您的方法返回void,而不是具体的类型,因此无法执行此操作。请始终记住,将扩展方法视为编写以变量作为参数的静态帮助器方法的语法糖。Ok。如果我在这里返回bool,是否可以这样做?当然,您可以有一个带有静态bool MyExtensionMethod签名的扩展方法(这个bool some_参数_name)。您可以使用Autofac的TypeInterceptors,或者从ContextBoundObject派生。这里的目标是调用Log()不在方法内部写入。@Asdfg:它不在现有方法内部;
LogWrapper
方法将
Action
委托作为参数。该委托可以执行任何您喜欢的任意代码(例如,对现有的、未更改的方法的调用)。这里的目标是在不写入内部方法的情况下调用Log()。@Asdfg:它不在现有方法内;
LogWrapper
方法将
Action
委托作为参数。该委托可以执行您喜欢的任意代码(例如,对现有的、未更改的方法的调用)。