Какой правильный синтаксис C # лямбда здесь? - PullRequest
2 голосов
/ 16 марта 2009

Я пытаюсь использовать лямбда-синтаксис, чтобы иметь возможность заменять механизмы правил поиска во время выполнения.

В приведенном ниже примере какой синтаксис мне нужен , чтобы иметь возможность передавать имя метода в мой метод GetSearchResults, чтобы метод GetSearchResults мог использовать соответствующую логику, чтобы решить, какие результаты вернуть?

string searchRulesMethodName = "SearchRules1(entry)";
var results = GetSearchResults(p => searchRulesMethodName);

Вот полный код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestLambda2
{
    class Program
    {
        static void Main(string[] args)
        {
            string searchRulesMethodName = "SearchRules1(entry)";
            var results = GetSearchResults(p => searchRulesMethodName);
            foreach (string entry in results)
            {
                Console.WriteLine(entry);
            }
            Console.ReadLine();
        }

        //only returns some entries
        public static bool SearchRules1(string entry)
        {
            if (entry == "one" || entry == "two") return true;
            return false;
        }

        //returns all entries
        public static bool SearchRules2(string entry)
        {
            return true;
        }

        public static List<string> GetSearchResults(Predicate<string> p)
        {
            string[] allEntries = { "one", "two", "three", "four", "five", "six", "seven" };
            List<string> results = new List<string>();
            foreach (string entry in allEntries)
            {
                if (p.Invoke(entry))
                {
                    results.Add(entry);
                }
            }
            return results;
        }

    }
}

ОТВЕТ:

Спасибо, Марк, это именно то, что я хотел сделать. Использование рефлексии также решило проблему «как сказать ему сигнатура свойства»:

static void Main(string[] args)
{
    string searchRulesMethodName = "SearchRules2";
    Predicate<string> predicate = (Predicate<string>) Delegate.CreateDelegate(typeof(Predicate<string>),
        typeof(Program).GetMethod(searchRulesMethodName));
    var results = GetSearchResults(predicate);

    foreach (string entry in results)
    {
        Console.WriteLine(entry);
    }
    Console.ReadLine();
}

1 Ответ

5 голосов
/ 16 марта 2009

Чтобы использовать строку, вам нужно использовать отражение, чтобы получить делегата;

string searchRulesMethodName = "SearchRules1";
Predicate<string> predicate = (Predicate<string>)
    Delegate.CreateDelegate(typeof(Predicate<string>),
        typeof(Program).GetMethod(searchRulesMethodName));
var results = GetSearchResults(predicate);

Конечно, switch будет намного быстрее и безопаснее, если вы знаете все параметры во время компиляции!

Predicate<string> predicate;
switch (searchRulesMethodName) {
    case "SearchRules1": predicate = SearchRules1; break;
    case "SearchRules2": predicate = SearchRules2; break;
    default: throw new InvalidOperationException("Unknown filter: "
        + searchRulesMethodName);
}
var results = GetSearchResults(predicate);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...