Gibt es eine bessere Möglichkeit, den Eigenschaftsnamen zu erhalten, wenn er über einen Lambda-Ausdruck übergeben wird? Hier ist was ich derzeit habe.
z.B.
GetSortingInfo<User>(u => u.UserId);
Es funktionierte, indem es nur dann als Mitgliedsausdruck umgewandelt wurde, wenn die Eigenschaft eine Zeichenfolge war. Da nicht alle Eigenschaften Zeichenfolgen sind, musste ich ein Objekt verwenden, aber dann würde es einen unären Ausdruck für diese zurückgeben.
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
hier aufgeführten Ansatz nur, um den Namen des Mitglieds abzurufen , nicht um den tatsächlichen Namen MemberInfo
selbst MemberInfo
abzurufen , da in bestimmten "dervied: base" -Szenarien nicht garantiert wird, dass der zurückgegebene Typ vom reflektierten Typ ist. Siehe Lambda-Ausdruck-nicht-Rückgabe-erwartet-Mitgliedinfo . Hat mich einmal gestolpert. Darunter leidet auch die akzeptierte Antwort.