มีวิธีที่ดีกว่าที่จะได้รับชื่อทรัพย์สินเมื่อส่งผ่านผ่านการแสดงออกแลมบ์ดา? นี่คือสิ่งที่ฉันมีอยู่ในปัจจุบัน
เช่น.
GetSortingInfo<User>(u => u.UserId);
มันทำงานโดยการหล่อมันเป็น memberexpression เฉพาะเมื่อคุณสมบัติเป็นสตริง เพราะคุณสมบัติไม่ทั้งหมดเป็นสตริงที่ฉันต้องใช้วัตถุ แต่แล้วมันจะส่งกลับ 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
ส่งคืนนั้นไม่รับประกันว่าจะเป็นประเภทที่สะท้อนในบางสถานการณ์ "dervied: base" ดูแลมบ์ดาแสดงออกที่ไม่กลับมาคาด-MemberInfo สะดุดฉันหนึ่งครั้ง คำตอบที่ได้รับการยอมรับก็มีความทุกข์เช่นกัน