Có cách nào tốt hơn để có được tên Thuộc tính khi được truyền qua biểu thức lambda không? Đây là những gì tôi hiện đang có.
ví dụ.
GetSortingInfo<User>(u => u.UserId);
Nó hoạt động bằng cách sử dụng nó như một bản ghi nhớ chỉ khi thuộc tính là một chuỗi. bởi vì không phải tất cả các thuộc tính là các chuỗi tôi phải sử dụng đối tượng nhưng sau đó nó sẽ trả về một biểu thức unaryexpression cho các thuộc tính đó.
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
cách tiếp cận được liệt kê ở đây để lấy tên của thành viên, chứ không phải để lấy MemberInfo
chính thực tế , vì MemberInfo
trả lại không được đảm bảo là loại được phản ánh trong các tình huống "dervied: base" nhất định. Xem lambda-biểu hiện-không trở lại-mong đợi-thành viêninfo . Vượt tôi một lần. Câu trả lời được chấp nhận quá chịu đựng điều này.