Вызов метода расширения для метода без явной ссылки - PullRequest
2 голосов
/ 06 августа 2020

Есть ли способ вызвать метод расширения для метода, но без явной ссылки?

Например, если у меня есть метод расширения:

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();
    }
}

Так есть ли способ вызвать метод расширения для метода, но без явной ссылки?

1 Ответ

4 голосов
/ 06 августа 2020

Нет, нельзя, так как это метод, который нельзя использовать с методами расширения.

Есть несколько обходных путей (. 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();
    
...