将实例方法作为参数传递而没有实例

时间:2019-04-24 15:58:22

标签: c#

我想知道在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
    }

1 个答案:

答案 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#程序员最容易阅读和期望的。