Как использовать Func, когда вам требуется доступ к его параметру при вызове? - PullRequest
0 голосов
/ 10 июня 2019

У меня есть словарь, который содержит строку в качестве ключа, и функцию, запускаемую при обнаружении указанной строки.Затем он передает использованный объект, который был обнаружен.Я просто хочу получить доступ к этому объекту в теле функции, но не уверен, как это сделать.Я предполагаю, что должен использоваться лямбда-оператор, но я не знаю, как правильно его использовать.

public Dictionary<string, Func<object, bool>> stringReceivedRegister;

Моя настройка

string received_name = StringFormater.GetName(receivedMessage);

object changed_string = openMethod.Invoke(instance, new object[] { receivedMessage });
StringTypes.Instance.stringReceivedRegister[received_name].Invoke(changed_string);

При добавлении функции в строкуReceivedRegisterкак бы я получил к нему доступ через функцию, которую я передал?

StringTypes.Instance.stringReceivedRegister.Add("Test", function where i can get access to 'changed string');

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Чтобы добавить функцию к stringReceivedRegister, вам сначала нужно объявить метод:

private static bool MyFunction(object x) {
    // ...
}

И затем вы можете передать MyFunction Add:

// Note the absence of () after "MyFunction". I am not actually calling it
stringReceivedRegister.Add("Test", MyFunction);

Параметр x будет ссылаться на changed_string, когда вы будете делать это:

StringTypes.Instance.stringReceivedRegister[received_name].Invoke(changed_string);

Очень раздражает необходимость объявлять метод очень рано, поэтому в C # 3 предусмотрены лямбда-выражения, позволяющие вамчтобы сделать это:

stringReceivedRegister.Add("Test", x => {
    // ...
});

Опять же, x будет ссылаться на changed_string, когда вы вызываете делегата с changed_string.

0 голосов
/ 10 июня 2019

Посмотрите на этот код:

static bool FunctionTest(object o) {
return true;
}
static void Main(string[] args) {
Dictionary<string, Func<object, bool>> dict = new Dictonary<string, Func<object, bool>>();
dict.Add("A", ((obj) => { return false; }));
dict.Add("B", FunctionTest);

Console.WriteLine(dict["A"](1));
Console.WriteLine(dict["B"](1));
...