我有一个C#应用程序。
我有几个不同的函数,它们具有不同的返回类型和传递给每个函数的不同参数。
我知道我可以这样做:
public object RunTheMethod(Func<string, int> myMethodName)
{
//... do stuff
int i = myMethodName("My String");
//... do more stuff
return true;
}
但我可能有两个我想要传递的功能。
第一个功能就像这个例子所示。它接受一个字符串并返回一个int。但是,如果我想传递一个对象或根本没有参数呢?
这里的通用选项是什么。
感谢
@PEOPLE 我在这里有很多好的建议。这就是我喜欢这个网站的原因。我需要自己做饭,喝杯茶,仔细看看这些建议。
我保证会回应。
谢谢大家!
答案 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
}