ラムダ式を介して渡されたときにプロパティ名を取得するより良い方法はありますか?これが私が現在持っているものです。
例えば。
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;
}
MemberExpression
ここにリストされているアプローチは、実際の名前を取得するのではなく、メンバーの名前を取得するためにのみ使用してください。返される値が特定の「派生:基本」シナリオで反映された型であることが保証されていないMemberInfo
ためMemberInfo
です。lambda-expression-not-returning-expected-memberinfoを参照してください。一度私をつまずかせた。受け入れられた答えもこれに苦しんでいます。