这里正确的C#lambda语法是什么?

这里正确的C#lambda语法是什么?,c#,lambda,C#,Lambda,我正在尝试使用lambda语法,以便能够在运行时替换搜索规则引擎 在下面的示例中,我需要什么语法才能将方法的名称传递给我的GetSearchResults方法,以便GetSearchResults方法可以使用适当的逻辑来决定返回哪些结果 string searchRulesMethodName = "SearchRules1(entry)"; var results = GetSearchResults(p => searchRulesMethodName); 以下是完整的代码: usi

我正在尝试使用lambda语法,以便能够在运行时替换搜索规则引擎

在下面的示例中,我需要什么语法才能将方法的名称传递给我的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;
        }

    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间TestLambda2
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串searchRulesMethodName=“SearchRules1(条目)”;
var results=GetSearchResults(p=>searchRulesMethodName);
foreach(结果中的字符串条目)
{
控制台写入线(条目);
}
Console.ReadLine();
}
//只返回一些条目
公共静态布尔搜索规则1(字符串条目)
{
if(entry==“one”| | entry==“two”)返回true;
返回false;
}
//返回所有条目
公共静态布尔搜索规则2(字符串条目)
{
返回true;
}
公共静态列表GetSearchResults(谓词p)
{
字符串[]allEntries={“一”、“二”、“三”、“四”、“五”、“六”、“七”};
列表结果=新列表();
foreach(allEntries中的字符串条目)
{
如果(p.Invoke(条目))
{
结果。添加(条目);
}
}
返回结果;
}
}
}
答复: 谢谢,马克,这正是我想做的。使用反射还解决了“如何告诉它属性签名”问题:

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();
}
static void Main(字符串[]args)
{
字符串searchRulesMethodName=“SearchRules2”;
谓词谓词=(谓词)委托.CreateDelegate(谓词的类型),
typeof(Program).GetMethod(searchRulesMethodName));
var results=GetSearchResults(谓词);
foreach(结果中的字符串条目)
{
控制台写入线(条目);
}
Console.ReadLine();
}

要使用字符串,必须使用反射来获取委托

string searchRulesMethodName = "SearchRules1";
Predicate<string> predicate = (Predicate<string>)
    Delegate.CreateDelegate(typeof(Predicate<string>),
        typeof(Program).GetMethod(searchRulesMethodName));
var results = GetSearchResults(predicate);
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);