Linq Tip:利用 Lambda 實作屬性選擇

Linq Tip:利用 Lambda 實作屬性選擇

這主題的名稱想了很久~~
簡單說 我想要實作一個功能是可以利用 強行別 的方式,來取得某型別的指定欄位清單,

直接看範例


範例Class



public class ForTest         
{             
    public string Name { get; set; }             
    public int Id { get; set; }            
    public DateTime CreatedDateTime { get; set; }        
 }

一般在傳遞型別欄位時的寫法



"Name,Id,CreatedDateTime"

或是

string[]{"Name","Id","CreatedDateTime"}

 



接收欄位清單的Method


public void DoSomethings(string[] propertyList)
{
    ...
}

 

 

這兩種寫法問題都是無法在編譯階段就知道錯誤,再來也要自己去背欄位名稱

 

開始改寫

Step 1 增加 對所有型別的 Extensions  Method

 


        /// 
        /// 利用Lambda選取屬性,並回傳屬性名稱陣列
        /// 
        /// 型別
        /// 屬性型別
        ///來源物件
        ///屬性選擇(ex. a=>a.PropertyName || a=>new{a.PropertyName1 , a.PropertyName2})
        /// 屬性名稱陣列
        public static string[] SelectProperty(this T src, Expression> expression)
        {
            if (expression == null)
            {
                return null;
            }
 
            return expression.GetSelectFieldNames();
        }

 

Step 2 增加 對 Expression 的 Extensions Method


        /// 
        /// 取得選取的欄位名稱陣列
        /// 
        /// T
        /// TProperty
        ///expression
        /// 欄位名稱陣列
        public static string[] GetSelectFieldNames(this Expression> expression)
        {
            if (expression.Body is NewExpression)
            {
                return ((NewExpression)expression.Body).Members.Select(a => a.Name).ToArray();
            }
            else if (expression.Body is MemberExpression)
            {
                return new string[] { ((MemberExpression)expression.Body).Member.Name };
            }
            else
            {
                throw new ArgumentException(string.Format("Expression '{0}' refers to a field, not a property.", expression.ToString()));
            }
        }

來看看如何使用


        public void Main()
        {
            DoSomethings(a => new { a.Name, a.Id }); //重點在可以利用 Lambda 選擇屬性囉~~~~
        }
 
        public void DoSomethings(Expression> propertySeleter)
        {
            var propertyList = propertySeleter.GetSelectFieldNames(); //取得選取到的屬性清單           
        }

 

執行結果

SNAGHTML2884852

 

這個Lambda屬性選擇,可以應用在很多地方,
我自己是大量應用在資料存取底層,比如說傳送要Select的欄位,還有選取要刪除或更新的欄位等等,
剩下就靠大家自己發揮囉~~
謝謝

如果有幫助的話,也請幫忙按個 "讚" 吧~~  讓大家可以多分享一些心得~~~  感謝~~~




 


 

  • 如果您覺得這篇文章有幫助,請您幫忙推薦一下或按上方的""給予支持,非常感激
  • 歡迎轉載,但請註明出處
  • 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝