有没有更好的方法在通过lambda表达式传递属性名时获取属性名?以下是我目前拥有的代码。
例如:
GetSortingInfo<User>(u => u.UserId);
只有当属性是字符串时,将其转换为成员表达式才会起作用。因为并非所有属性都是字符串,所以我不得不使用对象,但这样对于那些属性将返回一元表达式。
public static RouteValueDictionary GetInfo<T>(this HtmlHelper html,
Expression<Func<T, object>> action) where T : class
{
var expression = GetMemberInfo(action);
string name = expression.Member.Name;
return GetInfo(html, name);
}
private static MemberExpression GetMemberInfo(Expression method)
{
LambdaExpression lambda = method as LambdaExpression;
if (lambda == null)
throw new ArgumentNullException("method");
MemberExpression memberExpr = null;
if (lambda.Body.NodeType == ExpressionType.Convert)
{
memberExpr =
((UnaryExpression)lambda.Body).Operand as MemberExpression;
}
else if (lambda.Body.NodeType == ExpressionType.MemberAccess)
{
memberExpr = lambda.Body as MemberExpression;
}
if (memberExpr == null)
throw new ArgumentException("method");
return memberExpr;
}
MemberExpression
ж–№жі•иҺ·еҸ–жҲҗе‘ҳзҡ„еҗҚз§°пјҢиҖҢдёҚжҳҜиҺ·еҸ–е®һйҷ…зҡ„MemberInfo
жң¬иә«пјҢеӣ дёәеңЁжҹҗдәӣвҖңжҙҫз”ҹ:еҹәзЎҖвҖқеңәжҷҜдёӯпјҢиҝ”еӣһзҡ„MemberInfo
дёҚиғҪдҝқиҜҒжҳҜеҸҚе°„зұ»еһӢгҖӮиҜҰи§Ғlambda-expression-not-returning-expected-memberinfoгҖӮжӣҫз»Ҹи®©жҲ‘зҠҜдәҶй”ҷгҖӮжҺҘеҸ—зҡ„зӯ”жЎҲд№ҹеӯҳеңЁжӯӨй—®йўҳгҖӮ - nawfalnameof()
,例如:nameof(User.UserId)
。不需要任何辅助方法,它在编译时被替换! - S.Serpooshan