Czy istnieje lepszy sposób na uzyskanie nazwy właściwości po przekazaniu za pomocą wyrażenia lambda? Oto, co aktualnie mam.
na przykład.
GetSortingInfo<User>(u => u.UserId);
Działa poprzez rzutowanie go jako wyrażenia membranowego tylko wtedy, gdy właściwość jest ciągiem znaków. ponieważ nie wszystkie właściwości są łańcuchami, musiałem użyć obiektu, ale wtedy zwróciłby dla nich jednoargumentowe wyrażenie.
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
wymienione tutaj podejście tylko do uzyskania nazwy członka, a nie do uzyskania MemberInfo
samego samego, ponieważ MemberInfo
nie ma gwarancji , że zwracany typ będzie odzwierciedlony w niektórych scenariuszach „dervied: base”. Zobacz lambda-expression-not-return-expect-memberinfo . Potknąłem się raz. Cierpi na to również zaakceptowana odpowiedź.