Я пытаюсь использовать лямбда-синтаксис, чтобы иметь возможность заменять механизмы правил поиска во время выполнения.
В приведенном ниже примере какой синтаксис мне нужен , чтобы иметь возможность передавать имя метода в мой метод 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();
}