//ModelFor(person =>person.Name);
public void ModelFor<TModel, TValue>(
Expression<Func<TModel, TValue>> expression)
{
//Result should be "Name"
string nameOfTValue = ????;
}发布于 2011-01-06 00:05:57
编辑表达式:编辑之后,我想您想要的是表达式中涉及的成员的名称,当然,假设表达式首先是一个成员表达式。
((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;(不再相关):
要获取表示TValue类型参数类型的类型,可以使用运算符。
您可能需要:
typeof(TValue).Name但是如果合适的话,还要考虑FullName和AssemblyQualifiedName属性。
这实际上与表达式树无关;您可以使用此技术来获取任何泛型方法的类型参数。
发布于 2011-01-06 00:15:46
@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");https://stackoverflow.com/questions/4606211
复制相似问题