如何将函数传递给具有不同参数的函数并执行它c#

时间:2018-01-17 19:30:52

标签: c# functional-programming

我有一个C#应用程序。

我有几个不同的函数,它们具有不同的返回类型和传递给每个函数的不同参数。

我知道我可以这样做:

public object RunTheMethod(Func<string, int> myMethodName)
{
    //... do stuff
    int i = myMethodName("My String");
    //... do more stuff
    return true;
}

但我可能有两个我想要传递的功能。

第一个功能就像这个例子所示。它接受一个字符串并返回一个int。但是,如果我想传递一个对象或根本没有参数呢?

这里的通用选项是什么。

感谢

@PEOPLE 我在这里有很多好的建议。这就是我喜欢这个网站的原因。我需要自己做饭,喝杯茶,仔细看看这些建议。

我保证会回应。

谢谢大家!

4 个答案:

答案 0 :(得分:2)

一个选项是使函数参数取 no 参数:

public bool RunTheMethod(Func<int> f)
{
    //... do stuff
    int i = f();
    //... do more stuff
    return true;
}

然后,在调用RunTheMethod时,您可以捕获lambda表达式中的其他参数,如下所示:

var b1 = RunTheMethod(() => theFunctionThatTakesAString("foo"));
var b2 = RunTheMethod(() => theFunctionThatTakesTwoIntegers(42, 1337));

如果您希望能够改变输出类型,可以使RunTheMethod通用本身,如下所示:

public bool RunTheMethod<T>(Func<T> f)
{
    //... do stuff
    T x = f();
    //... do more stuff
    return true;
}

然而,在这一点上,输入参数是否是函数是否真的有意义是一个问题。我注意到这个问题是用功能编程标记的;在FP中,一个更惯用的设计,那就是简单地让方法取一个值:

public bool RunTheMethod<T>(T x)
{
    //... do stuff
    // no need to call a function to get x; you already have x
    //... do more stuff
    return true;
}

然后,调用方法(或函数)也变得更容易:

var b1 = RunTheMethod(theFunctionThatTakesAString("foo"));
var b2 = RunTheMethod(theFunctionThatTakesTwoIntegers(42, 1337));

如果您需要将值作为函数,因为您希望能够控制何时对其进行评估,请考虑改为使用Lazy<T>

答案 1 :(得分:1)

您实际上需要执行任意Action而不是Func

public object RunTheMethod(Action myMethod)
{
    //... do stuff
    myMethod();
    //... do more stuff
    return true;
}

RunTheMethod(() => Sing("La la la"));

答案 2 :(得分:0)

我认为你想以这种方式调用泛型方法:

public object Execute(MethodInfo mi, object instance = null, object[] parameters = null)
{
    return mi.Invoke(instance, parameters);
}

所以你的方法需要将这些作为参数。

答案 3 :(得分:0)

也许这些代码可以帮助你。

function getRating(ratingValue) {
     $.ajax({
          url: '/Rating/Create',
          type: "POST",
          data: {rating: ratingValue.value },
     success: function (data) {
          //Successmessage
          console.log(ratingValue);
     },
     error: function (xhr) {
          //Errormessage
    }