C# 如何将方法指定为方法的参数?

C# 如何将方法指定为方法的参数?,c#,methods,C#,Methods,对于C#,我不熟悉,如何创建一个将方法作为其参数之一的方法 听起来有点奇怪,但我希望它能在c#中得到支持 这就是我所尝试的: public void CalculateRepairedCars(int total, /*here I want to pass a method..*/) { ... } 这是我想通过的方法: public int Calculate{int totalCars, Condition condition} { ... } 有多种方法。我以前用过一台电脑

对于C#,我不熟悉,如何创建一个将方法作为其参数之一的方法

听起来有点奇怪,但我希望它能在c#中得到支持

这就是我所尝试的:

public void CalculateRepairedCars(int total, /*here I want to pass a method..*/)
{
    ...
}
这是我想通过的方法:

public int Calculate{int totalCars, Condition condition}
{
...
}

有多种方法。我以前用过一台电脑

private void SomeMethod()
{
    CalculateRepairedCars(100, YetAnotherMethod);
}

public void CalculateRepairedCars(int total, Action action)
{
    action.Invoke();  // execute the method, in this case "YetAnotherMethod"
}

public void YetAnotherMethod()
{
    // do stuff
}
如果作为参数传递的方法本身有参数(例如
YetAnotherMethod(int-param1)
),则可以使用以下方法传递:

在我的例子中,我不必从作为参数传递的方法返回值。如果必须返回值,请使用及其相关重载


刚才看到您用调用的方法更新了代码

public int Calculate(int totalCars, Condition condition)
{
    ...
}
要返回值,您需要
Func

public void CalculateRepairedCars(int total, Func<int, string, int> func)
{
    var result
        = func.Invoke(total, someCondition);  // where's "condition" coming from?

    // do something with result since you're not returning it from this method
}

c#方法类型称为委托。你可以声明它,分配一个方法,然后你可以用它做很多事情,包括把它作为一个参数传递。查一查!注意:委托的类型是安全的,因为委托必须与所指向的方法共享签名。

C#中的“将方法放入值中”(然后可以使用该值执行许多操作,例如将参数传递给另一个方法)称为为为为该方法创建值

委托的类型直接对应于它所指向的方法的签名(即其参数和返回值的数量和类型)。C#为不返回值的委托(及其同级)和返回值的委托(及其同级)提供现成的类型

在您的例子中,
Calculate
的签名与类型匹配,因此您可以编写

public void CalculateRepairedCars(int total, Func<int, Condition, int> calc)
{
    // when you want to invoke the delegate:
    int result = calc(someCondition, someInteger);
}

这非常简单,但是参数的确切类型将取决于您想要接受的方法的签名是什么。查看
Func
Action
类。为什么要这样做?但您可以传入操作或Func委托instead@Ahmedilyas这样做可能有很多原因。一个明显的例子是在方法完成时调用回调。@user3399628-im非常清楚。我只是想知道你的理由是什么-上下文是什么,如果你走的是正确的道路“将方法放入值中”这意味着什么?@user3399628:将其视为“将方法放入变量中”,例如
Func f=Calculate
。只有变量不需要存在;查看如何在不首先定义变量的情况下将
Calculate
传递给方法。我希望这有帮助:)
f
不是一个变量?@user3399628:是的。但是您不一定需要声明一个来调用
CalculateRepairedCars
。在
CalculateRepairedCars
内部,
calc
是一个委托类型的变量。
CalculateRepairedCars(100, Calculate);
public void CalculateRepairedCars(int total, Func<int, Condition, int> calc)
{
    // when you want to invoke the delegate:
    int result = calc(someCondition, someInteger);
}
CalculateRepairedCars(i, Calculate);