c# – 使用参数在expression.call中调用静态方法
发布时间:2020-12-15 04:27:58 所属栏目:百科 来源:网络整理
导读:我已经扩展了Contains方法的字符串类.我试图在Expression.Call中调用它,但如何正确传递参数? 代码:String包含方法: public static class StringExts{ public static bool NewContains(this string source,string ValToCheck,StringComparison StrComp) {
我已经扩展了Contains方法的字符串类.我试图在Expression.Call中调用它,但如何正确传递参数?
代码:String包含方法: public static class StringExts { public static bool NewContains(this string source,string ValToCheck,StringComparison StrComp) { return source.IndexOf(ValToCheck,StrComp) >= 0; } } 在表达式中调用为: public class Person { public string Name {get; set;} } public class Persons { public List<Person> lstPersons {get; set;} public Persons() { lstPersons = new List<Person>(); } } public class Filter { public string Id { get; set; } public Operator Operator { get; set; } public string value { get; set; } } public void Main() { //Get the json. //"Filters": [{"id": "Name","operator": "contains","value": "Microsoft"}] Filter Rules = JsonConvert.DeserializeObject<Filter>(json); // Get the list of person firstname. List<Person> lstPerson = GetFirstName(); ParameterExpression param = Expression.Parameter(typeof(Person),"p"); Expression exp = null; exp = GetExpression(param,rules[0]); //get all the name contains "john" or "John" var filteredCollection = lstPerson.Where(exp).ToList(); } private Expression GetExpression(ParameterExpression param,Filter filter){ MemberExpression member = Expression.Property(param,filter.Id); ConstantExpression constant = Expression.Constant(filter.value); Expression bEXP = null; switch (filter.Operator) { case Operator.contains: MethodInfo miContain = typeof(StringExts).GetMethod("NewContains",BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static); return Expression.Call(miContain,member,constant,Expression.Constant(StringComparison.OrdinalIgnoreCase));; break; } } 错误:
如何调用miContain中的参数来跟随Call()方法? 我已经更新了守则. 解决方法
您没有指定所有参数.如果为所有人创建表达式,它可以工作:
ParameterExpression source = Expression.Parameter(typeof(string)); string ValToCheck = "A"; StringComparison StrComp = StringComparison.CurrentCultureIgnoreCase; MethodInfo miContain = typeof(StringExts).GetMethod("NewContains",BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static); var bEXP = Expression.Call(miContain,source,Expression.Constant(ValToCheck),Expression.Constant(StrComp)); var lambda = Expression.Lambda<Func<string,bool>>(bEXP,source); bool b = lambda.Compile().Invoke("a"); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 判断两个IP地址是否在同一个网段中
- xcode – 当iOS应用程序链接到静态库时,如何获取丢弃的符号
- 常见的XML的两种解析方法
- 关于ajax 上传图片 enctype="multipart/form-data"
- cocos2dx 执行流程分析
- c# – 在Azure功能应用程序blobtrigger中设置blob的内容类型
- Detailed Item Cost Report (XML) timed out waiting for t
- objective-c – 需要在OpenGl中显示YUV的帮助
- ios – Firebase通过邮件邀请链接,给出404错误
- OO设计原则 — Single Responsibility Principle:OO设计的