c#通过表达式获取调用的属性名称 & 动态获取列表中特定字段的数据

获取表达式调用的字段名称

/// <summary>
        /// 获取表达式调用的字段名称
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="expr"></param>
        /// <returns></returns>
        private 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 "";
        }

调用方法

string desc = GetPropertyName<A>(f => f.Id);

System.Console.WriteLine(desc);

根据名称获取列表中制定字段的所有属性值

/// <summary>
        /// 根据名称获取列表中制定字段的所有属性值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="data"></param>
        /// <param name="propertyName"></param>
        /// <returns></returns>
        public List<TResult> GetData<T, TResult>(List<T> data, string propertyName)
        {
            // 创建表达式树
            var parameter = Expression.Parameter(typeof(T));
            var property = Expression.Property(parameter, propertyName);
            var lambda = Expression.Lambda<Func<T, TResult>>(
                Expression.Convert(property, typeof(TResult)), parameter);

            var selector = lambda.Compile();
            var result = data.Select(selector).ToList();
            return result;
        }

调用

var list=new List<Test>();
GetData(list,"name");
posted @ 2021-12-24 15:15  Hey,Coder!  阅读(133)  评论(0)    收藏  举报