लैंबडा एक्सप्रेशन के माध्यम से पास होने पर संपत्ति का नाम प्राप्त करने का एक बेहतर तरीका है? यहाँ मेरे पास वर्तमान में क्या है।
जैसे।
GetSortingInfo<User>(u => u.UserId);
इसे केवल एक झिल्ली के रूप में कास्टिंग करके काम किया जब संपत्ति एक स्ट्रिंग थी। क्योंकि सभी गुण तार नहीं हैं, मुझे ऑब्जेक्ट का उपयोग करना था लेकिन फिर यह उन लोगों के लिए एक unaryexpression लौटाएगा।
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
लौटाए जाने की गारंटी कुछ "विकृत: आधार" परिदृश्यों में परिलक्षित प्रकार की नहीं है। देखें लैम्ब्डा-एक्सप्रेशन-नॉट-रिटर्निंग-अपेक्षित-सदस्यिनफो । मुझे एक बार फँसाया। स्वीकृत उत्तर भी इससे ग्रस्त है।