SortedList со строкой в ​​качестве индекса и указателем на функцию или делегатом в качестве значения? И вызов функций по строкам? - PullRequest
1 голос
/ 25 августа 2011

Я не знаком с делегатами и лямбдами, но на данный момент я должен сделать две вещи:

  • Одна из них:

Мне нужнопередать функцию в 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 и "2" в tbArgument.Text, как я могу привести результат к tbResult.Text

Ответы [ 3 ]

4 голосов
/ 25 августа 2011

Потребовалось время, чтобы понять, что вы хотели. Итак, если я буду следовать за вами правильно, вы захотите:

  • Учитывая имя метода в строковой переменной, вызовите метод.

Простой ответ заключается в том, что для этого нет внутренних средств. Возможно, вы могли бы собрать что-то вместе с помощью Reflection, но это потребует больше усилий, чем оно того стоит.

Итак, нам нужно создать собственную таблицу отправки:

// 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 голос
/ 25 августа 2011

Это на самом деле работа для размышления, не имеющая ничего общего с лямбдами или делегатами.

Вам нужно будет сделать что-то вроде ...

MethodInfo method = typeof(ClassWithMethods).GetMethod(tbFunction.Text);
ClassWithMethods obj = new ClassWithMethods();
string result = method.Invoke(obj, new[] {tbArgument.Text});
tbResult.Text = result;

Проверять в системе.Отборная документация.

0 голосов
/ 25 августа 2011
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, но это, вероятно, просто дело вкуса.

В качестве альтернативы вы можете использовать рефлексию, чтобы вам не нужно было регистрировать каждый метод в списке.

...