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(); //取得選取到的屬性清單
}
執行結果
這個Lambda屬性選擇,可以應用在很多地方,
我自己是大量應用在資料存取底層,比如說傳送要Select的欄位,還有選取要刪除或更新的欄位等等,
剩下就靠大家自己發揮囉~~
謝謝
如果有幫助的話,也請幫忙按個 "讚" 吧~~ 讓大家可以多分享一些心得~~~ 感謝~~~
- 如果您覺得這篇文章有幫助,請您幫忙推薦一下或按上方的"讚"給予支持,非常感激
- 歡迎轉載,但請註明出處
- 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝