如何在自定义实体构建器中像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
相关产品推荐
相关产品推荐

