我有一個通用列表,我想要通過兩個屬性,優先級,然後通過描述來填充下拉列表。爲特定屬性排序動態列表<T>
我知道,當我現在正好對象列表的類型,我可以做
list = list.Orderby(x=>x.property1).ThenOrderBy(x=>x.property2).
我的問題是我怎麼能檢查property1和property2對象上存在,然後排序我的名單基礎上這些屬性。
我有一個通用列表,我想要通過兩個屬性,優先級,然後通過描述來填充下拉列表。爲特定屬性排序動態列表<T>
我知道,當我現在正好對象列表的類型,我可以做
list = list.Orderby(x=>x.property1).ThenOrderBy(x=>x.property2).
我的問題是我怎麼能檢查property1和property2對象上存在,然後排序我的名單基礎上這些屬性。
因爲您使用的是通用列表,編譯器會爲您檢查。
例如:如果你寫的代碼像
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所有類型的排序。
我不認爲user1444433甚至懶得閱讀泛型。 – dfdsfdsfsdf
您可以在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));
好,你正在嘗試做的方式是一個壞主意。嘗試使用if-else或切換大小寫,然後讓您的代碼按照您的要求相應地排序。
如果這些屬性屬於接口或類,那麼您可以在T –
上使用約束編譯器將爲您執行此操作。如果他們不存在編譯將失敗。 – Andrey
你是不是指一個'List'? –
Xiaoy312