SortedList使用字符串作为索引和函数指针或委托作为值?并通过字符串调用函数?

时间:2011-08-24 20:19:29

标签: c# function delegates lambda

我不熟悉代表和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

3 个答案:

答案 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,但这可能只是一个品味问题。

或者你可以使用反射,这样你就不需要在列表中注册每个方法。