/// <summary> /// ラムダ式からMemberExpressionを取得します。 /// </summary> /// <param name="expression">ラムダ式</param> /// <returns>フィールドまたはプロパティを表す式</returns> public static MemberExpression ExtractMemberExpression(LambdaExpression expression) { if (expression == null) { throw new ArgumentNullException(nameof(expression)); } return(This.ExtractMemberExpression(expression.Body)); }
/// <summary> /// メンバーを表す式木からメンバー名を取得します。 /// </summary> /// <typeparam name="T">メンバーを持つ型</typeparam> /// <param name="expressions">メンバーの式木</param> /// <returns>メンバー名</returns> public static string GetMemberName <T>(Expression <Func <T, object> > expression) { if (expression == null) { throw new ArgumentNullException(nameof(expression)); } var member = This.ExtractMemberExpression(expression); return(member?.Member.Name); }
/// <summary> /// 式木からメンバー名を取得します。 /// </summary> /// <typeparam name="T">メンバーを持つ型</typeparam> /// <param name="expression">式木</param> /// <returns>メンバー名のコレクション</returns> public static IEnumerable <string> GetMemberNames <T>(Expression <Func <T, object> > expression) { if (expression == null) { throw new ArgumentNullException(nameof(expression)); } //--- 本体がコンストラクタ呼び出しの場合 var body = expression.Body as NewExpression; if (body != null) { return(body.Members.Select(x => x.Name)); } //--- それ以外は通常処理 return(new [] { This.GetMemberName(expression) }); }