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