/// <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) });
        }