在没有显式引用的方法上调用扩展方法

Invoke an extension method on a method without a explicit reference

有没有办法在方法上调用扩展方法,但没有显式引用?

比如我有一个扩展方法:

public static class Extensions {
    public static void FooOn(this Func<string> method) =>
        Console.WriteLine($"Foo on {method()}");
}

我想也许我可以做这样的事情,但也许不能。

class Program {
    private string Bar() => "you"; 
    void Main() => Bar.FooOn();  // won't compile
}

相反,我似乎必须声明一个临时引用:

class Program {
    private string Bar() => "you"; 
    void Main(){
        Func<string> temp = Bar;
        temp.FooOn();
    }
}

那么有什么方法可以在方法上调用扩展方法,但没有显式引用吗?

不,你不能,因为它是一种方法,不能与扩展方法一起使用。

有几种解决方法 (.NET Fiddle):

  1. 正如问题中已经提到的,您可以创建一个临时变量,该变量引用该方法:
    Func<string> temp = Bar;
    temp.FooOn();
    
  2. 您可以明确地将 Bar 转换为 Func<string>
    static void Main() => ((Func<string>)Bar).FooOn();
    
  3. 您直接调用扩展方法,将 Bar 作为参数传递:
    static void Main() => Extensions.FooOn(Bar);
    
  4. 您将 Bar 存储为 Func<string> 变量:
    static Func<string> Bar = () => "you"; 
    static void Main() => Bar.FooOn();