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

C# 表达式作为属性和对象类型的函数参数,c#,.net,reflection,.net-core,C#,.net,Reflection,.net Core,我需要一个函数,它将以下内容作为参数: 对象的类型 对象的特定属性的名称 目前我做这件事很不方便,而且时间很长: public static void Add<TEntity, TProperty>(TEntity e, Expression<Func<TProperty>> expression) { var type = typeof(TEntity); var propertyName = ((MemberExpression)

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

  • 对象的类型
  • 对象的特定属性的名称
目前我做这件事很不方便,而且时间很长:

public static void Add<TEntity, TProperty>(TEntity e, Expression<Func<TProperty>> expression)
{
     var type = typeof(TEntity);
     var propertyName = ((MemberExpression) expression.Body).Member.Name;
}
publicstaticvoidadd(TEntity e,Expression)
{
变量类型=类型(强度);
var propertyName=((MemberExpression)expression.Body).Member.Name;
}
这将导致如下函数调用:
Add(Foo,()=>Foo.Bar)

但是,使用该解决方案,我有几个问题:

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

有更好的解决方案吗?

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

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

Add(Foo.Bar.Element.Type, x => x.Name)
publicstaticvoidadd(TEntity e,Expression)
添加(Foo.Bar.Element.Type,x=>x.Name)

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

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

Add(Foo.Bar.Element.Type, x => x.Name)
publicstaticvoidadd(TEntity e,Expression)
添加(Foo.Bar.Element.Type,x=>x.Name)

解决了这两个问题,不是吗?
公共静态void Add(这个TEntity unused,Expression)
应该更好地使用:
Foo.Bar.Element.Type.Add(x=>x.Name)
@SteveHarris:它不能防止
x=>UnrelatedObject.Foo
正如@SLaks所说的,它不能防止'x=>UnrelatedObject.Foo'问题,但是已经好了一点了,谢谢你!解决了这两个问题,不是吗?
publicstaticvoidadd(这个TEntity未使用,Expression exp)
应该更好地使用:
Foo.Bar.Element.Type.Add(x=>x.Name)
@SteveHarris:它不会阻止
x=>UnrelatedObject.Foo
正如@SLaks所说的,它不会阻止`x=>UnrelatedObject.Foo`问题,但它已经有点好了,谢谢你!您能否更具体地说明您希望函数做什么。现在这个示例没有做任何事情,所以很难知道您在寻找什么。拥有
Foo.Bar.Element.Type
不是您的函数问题,而是您的设计问题。当设计等级能够防止此类问题时,遵循“德米特定律”,除非
Foo.Bar.Element.Type
只是数据对象的层次结构,没有行为,它们只是相互连接的数据对象,没有行为。@JSteward我基本上想访问该属性的特定属性来处理它。您能不能更具体地说明您希望函数做什么。现在这个示例没有做任何事情,所以很难知道您在寻找什么。拥有
Foo.Bar.Element.Type
不是您的函数问题,而是您的设计问题。当设计等级能够防止此类问题时,遵循“德米特定律”,除非
Foo.Bar.Element.Type
只是没有行为的数据对象的层次结构,它们只是相互连接且没有行为的数据对象。@JSteward我基本上想访问该属性的特定属性来处理它。