我不熟悉代表和lambdas,但此时此刻,我必须做这两件事:
我需要将该函数传递给SortedList。我不知道怎么做。
为什么我需要它,是:
private string Func1(string s) { return s + "1"; }
private string Func2(string s) { return s + "2"; }
private string Func3(string s) { return s + "3"; }
private void WhatEver()
{
SortedList<string, ???> list = new SortedList<string, ???>;
list.Add("Func1", Func1);
list.Add("Func2", Func2);
list.Add("Func3", Func3);
// And after that I have to pass values and get results from functions
// Like
Console.WriteLine(list["Func1"]("Test"));
Console.WriteLine(list["Func2"]("Test"));
Console.WriteLine(list["Func3"]("Test"));
// Output should be:
//
// Test1
// Test2
// Test3
}
是否可以使用字符串调用函数?
例如:
假设我有三个文本框和一个函数:
tbFunction
tbArgument
tbResult
private string Test(string number)
{
int x = int.Parse(number);
return (x * x).ToString();
}
假设我在tbFunction.Text中有“Test”,在tbArgument.Text中有“2”,如何将结果带到tbResult.Text
答案 0 :(得分:4)
花了一段时间来弄清楚你想要什么。所以,如果我正确地关注你,你想要:
简单的答案是,没有内在的手段可以做到这一点。你可以用反射来拼凑一些东西,但这会比它的价值更多。
因此,我们需要创建自己的调度表:
// class member
var jumptbl = new SortedList<string, Func<string, string> >();
// : (in ctor)
jumptbl.Add("Test", Test);
// : (I'm guessing this is in a Click handler)
tbResult.Text = jumptbl[tbFunction.Text](tbArgument.Text)
进一步说,用于调用它的名称(在字符串中)不需要与函数本身的名称有任何连接。该方法甚至不必具有名称:
jumptbl.Add("Func1", s=> s + "1");
jumptbl.Add("Func2", s=> s + "2");
jumptbl.Add("Func3", s=> s + "3");
答案 1 :(得分:1)
这实际上是一项反思工作,与lambdas或代表无关。
您需要做类似......
的事情MethodInfo method = typeof(ClassWithMethods).GetMethod(tbFunction.Text);
ClassWithMethods obj = new ClassWithMethods();
string result = method.Invoke(obj, new[] {tbArgument.Text});
tbResult.Text = result;
在System.Reflection文档中查看。
答案 2 :(得分:0)
public delegate string YourDelegate(string number);
SortedList<string, YourDelegate> methods = new SortedList<string, YourDelegate>();
// Add more methods here
methods .Add("Test", Test);
...
public string CallMethod(string methodName, string number)
{
YourDelegate method;
if (methods.TryGetValue(methodName, out method))
return method(number);
else
return "Unknown method";
}
...
public void button1_Click(object sender, EventArgs e)
{
tbResult.Text = CallMethod(tbFunction.Text, tbArgument.Text);
}
我认为这只是你所要求的。 我个人会使用Dictinary,但这可能只是一个品味问题。
或者你可以使用反射,这样你就不需要在列表中注册每个方法。