c# - 创建一个创建动态表达式的方法
问题描述
我想创建一个返回字典的方法,如下所示。但是,我想成为参数 ara EntityType 和 columnNameList 的通用方法。我想这样打电话,
我的方法调用:
CreateColumnMap<Student>(new List<string>{"Name","Surname","Age"});
我的回报值
var columnsMap = new Dictionary<string, Expression<Func<Student, object>>>()
{
["Name"] = v => v.Name,
["Surname"] = v => v.Surname,
["Age"] = v => v.Age
};
学生.cs
public class Student
{
public string Name { get; set; }
public string Surname { get; set; }
public string Age { get; set; }
public string SchoolName { get; set; }
}
我开始了如下功能。但我无法完成。我怎样才能完成“???” 部分。
public Dictionary<string, Expression<Func<T, object>>> CreateColumnMap<T>(List<string> columNameList)
{
var dictionary = new Dictionary<string, Expression<Func<T, object>>>();
foreach (var columnName in columNameList)
{
//??????
dictionary.Add(); //????????????????????
//??????
}
return dictionary;
}
解决方案
使用Expression
类及其静态工厂方法,根据泛型参数类型提供的成员名称手动构建所需的表达式。
例如,下面使用Parameter
和Property
工厂方法手动构建 lambda 表达式的表达式树节点v => v.PropertyName
Expression<Func<TModel, object>> GetPropertyExpression<TModel>(string propertyName) {
// Manually build the expression tree for
// the lambda expression v => v.PropertyName.
// (TModel v) =>
var parameter = Expression.Parameter(typeof(TModel), "v");
// (TModel v) => v.PropertyName
var property = Expression.Property(parameter, propertyName);
var expression = Expression.Lambda<Func<TModel, object>>(property, parameter);
return expression;
}
然后你可以应用上述
public Dictionary<string, Expression<Func<T, object>>> CreateColumnMap<T>(List<string> columNameList) {
var dictionary = new Dictionary<string, Expression<Func<T, object>>>();
foreach (var columnName in columNameList) {
dictionary[columnName] = GetPropertyExpression<T>(columnName);
}
return dictionary;
}
推荐阅读
- sql - SQL Server - 未使用的 LEFT JOIN 影响执行计划
- angular - 未定义的 contants.ts API 值
- jquery - 当容器可见时如何使用jquery获取单选按钮的选中值
- bash - zsh:我在 bash 上运行良好的 shell 脚本不适用于 zsh
- django - Django Celery Beat 不执行旧任务
- java - 如何解析java中复杂的逻辑操作?
- forms - 颤动检查云Firestore集合中是否存在用户ID
- google-app-engine - 将应用程序流量从我的服务器重定向到托管在 Google App Engine 中的 API
- java - 即使设置了新路径,Java 版本也不会更新
- excel - 通过附加额外的零来更正 Excel 中的 HEX 值