我想知道在C#中是否可以将一个实例方法作为没有实例的委托传递。作为参考,可以通过执行example(InstanceClass::InstanceMethod)
在Java中实现。然后,编译器将此转换为Func<InstanceClass, ReturnType>
的等效项,它像提供的InstanceMethod()
一样在提供的InstanceClass
上调用item=>item.InstanceMethod()
。在C#中是否可行?如果可以,怎么办?
编辑:为澄清起见,我问我如何在不使用lambda表达式的情况下在C#中传递方法。给出的Lambda表达式是编译器将调用转换为示例的示例。如果该方法具有许多参数,则仅传递该方法而不使用Lambda表达式将很有用
编辑2:这是一个示例来说明我的问题。 Java:
class Instance{
public void InstanceMethod(){System.out.println("Hello World");}
public static void Example(){
ArrayList<Instance> list = new ArrayList<>(5);
list.add(new Instance());
list.forEach(Instance::InstanceMethod)
}
}
输出:Hello World
C#:
public class Instance{
public void InstanceMethod(){Console.WriteLine("Hello World");}
public static void ForEach<T>(this IEnumerable<T> input, Action<T> action){
foreach(T item in input){
action(item);
}
}
public static void Example(){
List<Instance> list = new ArrayList<>(5);
list.Add(new Instance());
list.ForEach(Instance.InstanceMethod);//error need instance to call method
}
答案 0 :(得分:0)
即使在Java中,您仍在处理实例,但是Java的syntactic sugar隐藏了该实例。
您的情况没有对应的内容。你必须要做
public static void Example()
{
var list = new List<Instance>(5);
list.Add(new Instance());
list.ForEach(x => x.InstanceMethod());
}
或将static
添加到InstanceMethod
(因为该方法没有状态):
public static void InstanceMethod()
{
Console.WriteLine("Hello World");
}
public static void Example()
{
var list = new List<Instance>(5);
list.Add(new Instance());
list.ForEach(x => InstanceMethod());
}
如果您的InstanceMethod
接受了Instance
作为参数,而Example
不是静态的,则有一些称为{{3}的C#语法糖}会起作用:
public void InstanceMethod(Instance x)
{
Console.WriteLine("Hello World");
}
public void Example()
{
var list = new List<Instance>(5);
list.Add(new Instance());
list.ForEach(InstanceMethod);
}
以上所有内容中,第一个是惯用的C#,我会选择的。这可能是C#程序员最容易阅读和期望的。