C'è un modo migliore per ottenere il nome della proprietà quando viene passato tramite un'espressione lambda? Ecco quello che ho attualmente.
per esempio.
GetSortingInfo<User>(u => u.UserId);
Ha funzionato lanciandolo come un'espressione membere solo quando la proprietà era una stringa. poiché non tutte le proprietà sono stringhe, ho dovuto usare l'oggetto, ma poi sarebbe tornata una espressione unaria per quelle.
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
approccio elencato qui solo per ottenere il nome del membro, non per ottenere l'effettivo MemberInfo
stesso, poiché MemberInfo
non è garantito che il reso sia del tipo riflesso in alcuni scenari "dervied: base". Vedi lambda-expression-not-return-expected-memberinfo . Mi ha inciampato una volta. Anche la risposta accettata ne soffre.