You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义实体构建器中像EF Core那样获取实体属性名?

从表达式中提取属性名的实现方法

要从Expression<Func<TEntity, TProperty>>中获取属性名,你需要解析表达式树,提取出表示属性访问的MemberExpression节点。以下是具体实现步骤:

1. 编写属性名提取的辅助方法

创建一个静态工具方法处理表达式解析,同时加入异常处理应对非属性访问的表达式:

public static class ExpressionHelper
{
    public static string GetPropertyName<TEntity, TProperty>(Expression<Func<TEntity, TProperty>> propertyExpression)
    {
        // 解析lambda表达式的主体部分
        var memberExpr = propertyExpression.Body as MemberExpression;
        if (memberExpr == null)
        {
            // 处理值类型装箱等转换表达式
            var unaryExpr = propertyExpression.Body as UnaryExpression;
            if (unaryExpr != null)
            {
                memberExpr = unaryExpr.Operand as MemberExpression;
            }
        }

        if (memberExpr == null || !(memberExpr.Member is PropertyInfo))
        {
            throw new ArgumentException("传入的表达式必须是属性访问表达式", nameof(propertyExpression));
        }

        return memberExpr.Member.Name;
    }
}

2. 在实体构建器中集成该方法

将辅助方法替换MyEntityBuilder中**Do something with the propertyExpression**的逻辑:

public class MyEntityBuilder<TEntity>
{
    private MyEntity entity;

    public MyPropertyBuilder<TProperty> Property<TProperty>(Expression<Func<TEntity, TProperty>> propertyExpression)
    {
        string propertyName = ExpressionHelper.GetPropertyName(propertyExpression);
        MyProperty property = entity.Properties
            .Single(x => x.PropertyType == typeof(TProperty) && x.PropertyName == propertyName);
        
        return new MyPropertyBuilder(property);
    }
}

补充说明

  • 该实现覆盖了常规属性访问场景,包括值类型装箱转换的特殊情况。
  • 若传入非法表达式(如方法调用、字段访问),会抛出明确异常便于调试。

内容的提问来源于stack exchange,提问作者Erray1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:33:14