Apakah ada cara yang lebih baik untuk mendapatkan nama Properti saat dilewatkan melalui ekspresi lambda? Inilah yang saya miliki saat ini.
misalnya.
GetSortingInfo<User>(u => u.UserId);
Itu bekerja dengan melemparkannya sebagai ekspresi anggota hanya ketika properti itu adalah string. karena tidak semua properti adalah string saya harus menggunakan objek tetapi kemudian akan mengembalikan unaryexpression untuk itu.
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
pendekatan yang tercantum di sini hanya untuk mendapatkan nama anggota, bukan untuk mendapatkan yang sebenarnya MemberInfo
, karena yang MemberInfo
dikembalikan tidak dijamin dari tipe yang tercermin dalam skenario "dervied: base" tertentu. Lihat lambda-ekspresi-tidak-kembali-diharapkan-anggota-info . Membuatku tersandung sekali. Jawaban yang diterima juga menderita dari ini.