在没有显式引用的方法上调用扩展方法
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):
- 正如问题中已经提到的,您可以创建一个临时变量,该变量引用该方法:
Func<string> temp = Bar;
temp.FooOn();
- 您可以明确地将
Bar
转换为 Func<string>
:
static void Main() => ((Func<string>)Bar).FooOn();
- 您直接调用扩展方法,将
Bar
作为参数传递:
static void Main() => Extensions.FooOn(Bar);
- 您将
Bar
存储为 Func<string>
变量:
static Func<string> Bar = () => "you";
static void Main() => Bar.FooOn();
有没有办法在方法上调用扩展方法,但没有显式引用?
比如我有一个扩展方法:
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):
- 正如问题中已经提到的,您可以创建一个临时变量,该变量引用该方法:
Func<string> temp = Bar; temp.FooOn();
- 您可以明确地将
Bar
转换为Func<string>
:static void Main() => ((Func<string>)Bar).FooOn();
- 您直接调用扩展方法,将
Bar
作为参数传递:static void Main() => Extensions.FooOn(Bar);
- 您将
Bar
存储为Func<string>
变量:static Func<string> Bar = () => "you"; static void Main() => Bar.FooOn();