【问题标题】:get/set a property by expression通过表达式获取/设置属性
【发布时间】:2014-06-30 19:56:42
【问题描述】:

试图通过将 oracle 数据库中的字段映射到对象的属性来创建数据访问组件。我创建了一个基础对象,它接受一个类型并像这样调用......

public class Document : DataProviderBase<DataObjects.Document> 
{ 
    // code goes here... 
}

此基础对象有一个名为 AddMapping 的方法,它将数据库字段映射到这样的属性...

this.AddMapping<int>("ATD_KEY", "Key")

在这种情况下...

  • int 是属性类型
  • ATD_KEY是数据库中的字段名
  • KeyDataObjects.Document 上的属性名称

代码使用...

typeof(<TParent>).GetProperty(<property name>)

..获取PropertyInfo,用于获取和设置属性。 虽然这很好,但我想在 AddMapping 方法中添加一些类型安全和 lambda 表达式。我想做类似以下的事情......

this.AddMapping<int>("ATD_KEY", o => o.Key)

..其中oDataProviderBase 提供的类型。这将确保Key 属性实际上是int 类型,并确保字符串"Key" 不会拼写错误或大小写错误,因为第一个AddMapping 方法中显示的当前工作代码存在问题。

这可能吗?如果是这样怎么办?

我找到的最接近的例子是这个 Dynamic Expression from the Property of the object of the class,但是这仍然是通过字符串而不是表达式来引用属性。

【问题讨论】:

  • 有点不清楚您要实现什么目标:您能否澄清您的问题以及预期解决方案的任何实际优点?谢谢和问候,
  • 这里的目的是打字安全。前一种方法中的属性名称总是拼写错误并导致错误。这有帮助吗?

标签: c# lambda


【解决方案1】:

你可以使用类似的东西:

public void AddMapping<T>(fieldName, Expression<Func<TParent, T>> propExpr)
{
    var memberExpr = (MemberExpression)propExpr.Body;
    PropertyInfo property = (PropertyInfo)memberExpr.Member;
    ...
}

【讨论】:

    【解决方案2】:

    当然可以:

    public static PropertyInfo GetProperty<TParent>(Expression<Func<TParent, object>> prop)
    {
        var expr = prop.Body;
    
        if (expr.NodeType == ExpressionType.Convert)
            expr = ((UnaryExpression)expr).Operand;
    
        if (expr.NodeType == ExpressionType.MemberAccess)
            return ((MemberExpression)expr).Member as PropertyInfo;
    
        throw new ArgumentException("Invalid lambda", "prop");
    }
    
    public void AddMapping<TParent>(fieldName, Expression<Func<TParent, object>> prop)
    {
        AddMapping(fieldName, GetProperty(prop).Name);
    }
    

    这种方法的优点是只需要一个类型参数(TParent)。您传入一个可能包含转换为属性类型的 lambda。我们去掉它,然后得到成员表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多