2016-04-25 66 views
1

我有一個通用列表,我想要通過兩個屬性,優先級,然後通過描述來填充下拉列表。爲特定屬性排序動態列表<T>

我知道,當我現在正好對象列表的類型,我可以做

list = list.Orderby(x=>x.property1).ThenOrderBy(x=>x.property2). 

我的問題是我怎麼能檢查property1和property2對象上存在,然後排序我的名單基礎上這些屬性。

+7

如果這些屬性屬於接口或類,那麼您可以在T –

+1

上使用約束編譯器將爲您執行此操作。如果他們不存在編譯將失敗。 – Andrey

+0

你是不是指一個'List '? – Xiaoy312

回答

2

因爲您使用的是通用列表,編譯器會爲您檢查。

例如:如果你寫的代碼像

List<Object> list = new List<Object>(); 
var newlist = list.Orderby(x=>x.property1).ThenOrderBy(x=>x.property2); 

你會得到property1 & property2一個編譯器錯誤,因爲編譯器會找不到對象類型這些屬性。

如果你想支持不同的類型,每個類型應該有這兩個屬性,正確的方法是創建一個與這兩個屬性的接口,讓每個你想要支持的類型實現該接口,然後使用約束就像Arturo提出的那樣。

喜歡的東西

interface ICanBeSorted 
{ 
    string property1 {get;} 
    string property2 {get; 
} 

public List<T> MySortMethod(List<T> list) where T : ICanBeSorted 
{ 
    return list.OrderBy(x=>x.property1).ThenOrderBy(x=>x.property2); 
} 

這種方法將能夠實現界面ICanBeSorted所有類型的排序。

+1

我不認爲user1444433甚至懶得閱讀泛型。 – dfdsfdsfsdf

0

您可以在try-catch塊包裹選擇:

Func<dynamic, dynamic> DynamicProperty(Func<dynamic, dynamic> selector) 
{ 
    return x => 
    { 
     try 
     {   
      return selector(x); 
     } 
     catch (RuntimeBinderException) 
     { 
      return null; 
     } 
    }; 
} 

用法:

var sorted = list 
    .OrderBy(DynamicProperty(x => x.property1)) 
    .ThenBy(DynamicProperty(x => x.property2)); 
0

好,你正在嘗試做的方式是一個壞主意。嘗試使用if-else或切換大小寫,然後讓您的代碼按照您的要求相應地排序。