c# - 使用反射和表达式的自动列映射

标签 c# entity-framework reflection .net-core expression-trees

是否可以通过反射来自动化这些映射?

我有一个简单的列映射:

var columnsMap = new Dictionary<string, Expression<Func<Industry, object>>>
{
    ["id"] = v => v.Id,
    ["name"] = v => v.Name,
    ["isActive"] = v => v.IsActive
};

columnsMap 运行时结果:

enter image description here


我想在包装类中自动执行这些映射:

 public class QueryColumnMapper<T> : Dictionary<string, Expression<Func<T, object>>>
    {
        public QueryColumnMapper<T> GenerateMappings()
        {
            foreach (var item in typeof(T).GetProperties())
            {
                // get dictionary key ======> its OK
                var name = Char.ToLowerInvariant(item.Name[0]) + item.Name.Substring(1); //camel-case name

                // get expression    =======> this is the problem. wrong way
                Expression<Func<T, object>> exp = v => v.GetType().GetProperty(item.Name);
                //Expression<Func<T, object>> exp = v => v.?????;    <-----   

                // add to mapper object
                this.Add(name, exp);
            }
            return this;
        }
    }

使用此类的示例:

var columnsMap = new QueryColumnMapper<Industry>().GenerateMappings();  

columnsMap运行时结果: enter image description here

我不知道是否可以在运行时动态获取我的表达式?

(我正在使用此映射字典对 Entity Framework IQueryable 查询应用过滤。第一个示例(手动映射)其工作,但我不知道如何在运行中执行此操作-无需手动映射的时间)

最佳答案

您可以使用属性名称手动构建自定义表达式

// x =>
var parameter = Expression.Parameter(typeof(T));
// x.Name
var mapProperty = Expression.Property(parameter, "Name");
// (object)x.Name
var convertedExpression = Expression.Convert(mapProperty, typeof(object));
// x => (object)x.Name
var exp = Expression.Lambda<Func<T, object>>(convertedExpression, parameter);

如果这是一个常见的子集,并且您发现自己经常这样做,则可以创建一个基本接口(interface)。

关于c# - 使用反射和表达式的自动列映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51421773/

相关文章:

c# - 如何从基类中获取子类的 `Type`

c# - SQLite + EntityFramework 6 设置

php - 获取对象的所有定义函数

java - 反射 IllegalArgumentException

c# - 如何在 WPF 中更改每列项目的字体大小

java - 将 Enumeration<Integer> for 循环从 Java 转换为 C#? C# 中的 Enumeration<Integer> 到底是什么?

mysql - MySQL tinyint 和 Entity Framework 代码首先出现问题

asp.net - Web.config 中使用附加 .mdf 数据库的数据库连接字符串不起作用

java - 如何迭代一个类的方法,然后迭代返回的对象并调用另一个方法?

c# - 如何锁定字典?