表达式作为属性和对象类型的函数参数

时间:2018-06-13 14:36:30

标签: c# .net reflection .net-core

我需要一个函数,它将以下内容作为参数:

  • 对象的类型
  • 对象的特定属性的名称

目前我这样做的方式相当不方便:

public static void Add<TEntity, TProperty>(TEntity e, Expression<Func<TProperty>> expression)
{
     var type = typeof(TEntity);
     var propertyName = ((MemberExpression) expression.Body).Member.Name;
}

这会产生如下函数调用:Add(Foo, () => Foo.Bar);

然而,有了这个解决方案,我有几个问题:

  • 当我有这样一个对象时,它变得非常长:Add(Foo.Bar.Element.Type, () => Foo.Bar.Element.Type.Name)并且看起来很丑陋。
  • 无法确保propertyName是对象类型的属性。
    • 我实际上并没有对e做任何事情,因此没有使用它。

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

您可以通过向lambda添加参数来解决第一个问题:

public static void Add<TEntity, TProperty>(TEntity e, Expression<Func<TEntity, TProperty>> expression)

Add(Foo.Bar.Element.Type, x => x.Name)