//ModelFor(person =>person.Name);
public void ModelFor<TModel, TValue>(
Expression<Func<TModel, TValue>> expression)
{
//Result should be "Name"
string nameOfTValue = ????;
}
回答
编辑:编辑完成后,我认为你需要表达式中涉及的成员的名字,假设表达式首先是成员表达式。
((MemberExpression)expression.Body).Member.Name
更健壮,你可以这样做:
var memberEx = expression.Body as MemberExpression;
if (memberEx == null)
throw new ArgumentException("Body not a member-expression.");
string name = memberEx.Member.Name;
(不再相关):
要获得System.Type
表示TValue
类型的类型 - 参数,您可以使用typeof
运算符。
你可能想:如果合适
typeof(TValue).Name
还要考虑FullName
和AssemblyQualifiedName
性能。
这实际上与表达式树无关;您可以使用此技术获取任何通用方法的类型参数类型。
哇,我们完全写了相同的答案 – CodesInChaos 2011-01-05 16:07:24
我不认为这是正确的,我认为他希望参数的名称在TValue类型的表达式中。 – casperOne 2011-01-05 16:10:32
@casperOne:你可能是对的;我不确定。让我们等待澄清。 – Ani 2011-01-05 16:12:57
@Ani:我不认为这是正确的,我认为他希望在类型的表达式的参数的名称TValue
如果这是真的......这部作品1深只有水平,但可能是得心应手反正:
var nameOfTValue = ((MemberExpression)expression.Body).Member.Name;
这里是聪明的实现,应该能够处理多个层次:
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));
}
}
用法:
var fieldName=PropertyName.For<Customer>(x=>x.Address.Region);
//fieldName==Address.Region
另一个技巧,这可以用反射很好地结合:
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;
}
允许直接设置容易的特性,可以为测试夹具是有用的:
var customer=new Customer("firstName","lastName");
customer.Set(x=>x.Name, "different firstName");
不错,我真的很喜欢它! – Raffaeu 2011-01-19 14:37:48
- 1. 将表达式<Func <TModel,TValue >>转换为表达式<Func <TModel,bool >>
- 2. 如何创建Func <TSource>到表达式<Func <TSource,TValue >>
- 3. 从表达式<Func <TModel,字符串>>转换为表达式<Func <TModel,bool >>
- 4. asp.net mvc将表达式<Func <TModel,TProperty >>转换为表达式<Func <TModel,bool >>
- 5. MVC3扩展方法<TModel,TValue>
- 6. 表达式<Func <TModel,string >>到表达式<动作<TModel>>“Getter”到“Setter”
- 7. 转换字典<TKEY的,列表<TValue>>到ReadOnlyDictionary <TKEY的,ReadOnlyCollection <TValue>>
- 8. ConcurrentDictionary <TKey,TValue> VS字典<TKey,TValue>
- 9. 为什么不能/不能IDictionary <TKey,TValue>实施ILookup <TKey,TValue>?
- 10. 自己添加方法的字典<TKey,TValue>需要表达式<Func<T>>作为参数
- 11. 如何创建表达式<Func <TModel,TProperty >>;
- 12. 如何将IDictionary <TKey,列表<TValue>>转换为IDictionary <TKey,IEnumerable <TValue>>?
- 13. 转换表达<Func键<TModel的,IList的<TItem> >>以表达<Func键<TModel的,IEnumerable的>>
- 14. PropertyInfo to Expression <Func <TModel,TProperty >>
- 15. 类ObservableDictionary <TKEY的,TValue>中:IDictionary的<TKEY的,TValue>中的DataContract
- 16. 嵌套接口:将IDictionary <TKey,IList <TValue>>转换为IDictionary <TKey,IEnumerable <TValue>>?
- 17. 语法<(中<(<'TKEY的,TValue>中)>)> .. ::枚举
- 18. 不可变的字典<TKey,TValue>
- 19. 如何获取Dictionary <TKey,TValue>的所有值作为IList <TValue>?
- 20. 字典用List <>作为TValue
- 21. 作为对象初始化的属性表达式<Func <TModel,TProperty >>?
- 22. 转换表达<Func键<FromType>>以表达<Func<ToType>>
- 23. 如何获得给定类型的TKey和TValue字典<TKey,TValue>类型
- 24. 将IGrouping <TKey,TValue>转换为IDictionary的推荐方法<TKey,IEnumerable <TValue>>
- 25. 创建扩展方法TryGetValue可枚举的(TKEY的,出TValue)<KeyValuePair <TKEY的,TValue >>就像字典的<TKEY的,TValue>中
- 26. 表达式<func>?
- 27. 重构功能<T>到表达式<Func<T>>
- 28. 将表达式<Func<T, U>>转换为表达式<Func <object,object >>
- 29. 将表达式<Func <T,TProperty >>转换为表达式<Func <object,object >>,反之亦然
- 30. 如何将表达式<Func <T, bool>>转换为表达式<Func <Type, bool>>?
你需要澄清一下,你想要的类型TValue的名称,或者你想要的名称的p表达中的参数? – casperOne 2011-01-05 16:10:57
@casperOne - 我编辑 – Freshblood 2011-01-05 16:12:24
@casperOne'TValue'总是返回类型而不是普通参数。 – CodesInChaos 2011-01-05 16:13:00