c#表达式扩展与或非 通过表达式获取字段属性名称
2021/12/24 17:07:37
本文主要是介绍c#表达式扩展与或非 通过表达式获取字段属性名称,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
public static class ExpressionHelper { #region 与或非封装 public static Expression<Func<T, bool>> True<T>() { return param => true; } public static Expression<Func<T, bool>> False<T>() { return param => false; } public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> one, Expression<Func<T, bool>> another) { //return one.Compose(another, Expression.AndAlso); return one.Compose(another, Expression.And); } public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> one, Expression<Func<T, bool>> another) { return one.Compose(another, Expression.Or); //return one.Compose(another, Expression.OrElse); } public static Expression<Func<T, bool>> Compose<T>(this Expression<Func<T, bool>> one, Expression<Func<T, bool>> another, Func<Expression, Expression, Expression> action) { //创建新参数 var newParameter = Expression.Parameter(typeof(T)); var parameterReplacer = new ParameterReplacer(newParameter); var left = parameterReplacer.Replace(one.Body); var right = parameterReplacer.Replace(another.Body); var body = action(left, right); return Expression.Lambda<Func<T, bool>>(body, newParameter); } /// <summary> /// 参数替换 /// </summary> internal class ParameterReplacer : ExpressionVisitor { public ParameterReplacer(ParameterExpression paramExpr) { Parameter = paramExpr; } //新的表达式参数 private ParameterExpression Parameter { get; set; } public Expression Replace(Expression expr) { return this.Visit(expr); } /// <summary> /// 覆盖父方法,返回新的参数 /// </summary> /// <param name="p"></param> /// <returns></returns> protected override Expression VisitParameter(ParameterExpression p) { return Parameter; } } #endregion /// <summary> /// 获取表达式调用的字段名称 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="expr"></param> /// <returns></returns> public static string GetPropertyName<T>(Expression<Func<T, object>> expr) { switch (expr.Body) { case MemberExpression memberExpression: return memberExpression.Member.Name; case UnaryExpression unaryExpression: if (unaryExpression.Operand is MemberExpression expression) { return expression.Member.Name; } break; default: break; } return ""; } }
这篇关于c#表达式扩展与或非 通过表达式获取字段属性名称的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#