首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Expression<Func<TModel,TValue>>我怎么才能得到TValue的名字?

Expression<Func<TModel,TValue>>我怎么才能得到TValue的名字?
EN

Stack Overflow用户
提问于 2011-01-06 00:04:04
回答 2查看 4.7K关注 0票数 8
代码语言:javascript
复制
//ModelFor(person =>person.Name);
public void ModelFor<TModel, TValue>(
    Expression<Func<TModel, TValue>> expression)
{
    //Result should be "Name"
    string nameOfTValue = ????;     
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-06 00:05:57

编辑表达式:编辑之后,我想您想要的是表达式中涉及的成员的名称,当然,假设表达式首先是一个成员表达式。

代码语言:javascript
复制
((MemberExpression)expression.Body).Member.Name

为了更健壮,您可以执行以下操作:

代码语言:javascript
复制
var memberEx = expression.Body as MemberExpression;

if (memberEx == null)
     throw new ArgumentException("Body not a member-expression.");

string name = memberEx.Member.Name;

(不再相关):

要获取表示TValue类型参数类型的类型,可以使用运算符。

您可能需要:

代码语言:javascript
复制
typeof(TValue).Name

但是如果合适的话,还要考虑FullNameAssemblyQualifiedName属性。

这实际上与表达式树无关;您可以使用此技术来获取任何泛型方法的类型参数。

票数 9
EN

Stack Overflow用户

发布于 2011-01-06 00:15:46

@Ani:我不认为这是正确的,我认为他想要类型为TValue的表达式中的参数名称

如果这是真的。这只适用于1级深度,但无论如何可能会很方便:

代码语言:javascript
复制
var nameOfTValue = ((MemberExpression)expression.Body).Member.Name; 

以下是更智能的实现,应该能够处理多个级别:

代码语言:javascript
复制
 public class PropertyName{
    public static string For<T>(
      Expression<Func<T,object>> expression){
      var body=expression.Body;
      return GetMemberName(body);
    }
    public static string For(
      Expression<Func<object>> expression){
      var body=expression.Body;
      return GetMemberName(body);
    }
    public static string GetMemberName(
      Expression expression){
      if(expression is MemberExpression){
        var memberExpression=(MemberExpression)expression;
        if(memberExpression.Expression.NodeType==
           ExpressionType.MemberAccess)
          return GetMemberName(memberExpression.Expression)
            +"."+memberExpression.Member.Name;
        return memberExpression.Member.Name;
      }
      if(expression is UnaryExpression){
        var unaryExpression=(UnaryExpression)expression;
        if(unaryExpression.NodeType!=ExpressionType.Convert)
          throw new Exception(string.Format
            ("Cannot interpret member from {0}",expression));
        return GetMemberName(unaryExpression.Operand);
      }
      throw new Exception
        (string.Format("Could not determine member from {0}",expression));
    }
  }

用法:

代码语言:javascript
复制
var fieldName=PropertyName.For<Customer>(x=>x.Address.Region);
//fieldName==Address.Region

另一个技巧,这可以很好地与反射相结合:

代码语言:javascript
复制
public static T Set<T,TProp>(this T o,
   Expression<Func<T,TProp>> field,TProp value){
  var fn=((MemberExpression)field.Body).Member.Name;
  o.GetType().GetProperty(fn).SetValue(o,value,null);
  return o;
}

允许轻松地直接设置属性,可用于测试夹具:

代码语言:javascript
复制
var customer=new Customer("firstName","lastName");
customer.Set(x=>x.Name, "different firstName");
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4606211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档