通過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;
}
我發現你可以做的另一種方法是強烈輸入源和屬性,並明確推斷lambda的輸入。不確定這是否是正確的術語,但這是結果。
public static RouteValueDictionary GetInfo<T,P>(this HtmlHelper html, Expression<Func<T, P>> action) where T : class
{
var expression = (MemberExpression)action.Body;
string name = expression.Member.Name;
return GetInfo(html, name);
}
然後這樣稱呼它。
GetInfo((User u) => u.UserId);
並且它有效。
謝謝大家。
好吧,沒有必要調用.Name.ToString()
,但廣泛的是關於它,是的。您可能需要的唯一考慮因素是x.Foo.Bar
是否應返回“Foo”,“Bar”或異常 - 即您是否需要迭代。
(重新評論)有關靈活排序的更多信息,請參閱此處 。