2015-10-15 69 views
2

以下代碼片段正常工作。C#中OrderBy Switch的替代品

switch (sortOrder) 
{ 
    case "Group": 
     list = list.OrderBy(o => o.Group).ToList(); 
     break; 
    case "Company": 
     list = list.OrderBy(o => o.Company).ToList(); 
     break; 
    case "CurrencyId": 
     list = list.OrderBy(o => o.CurrencyId).ToList(); 
     break; 
    case "Field": 
     list = list.OrderBy(o => o.Field).ToList(); 
     break; 
} 

但我想寫一個更靈活的代碼,根本不使用開關。例如:

list = list.OrderBy(o => o.sortOrder).ToList(); 

我該怎麼做?

+0

http://stackoverflow.com/questions/2728340/how-can-i-do-an-orderby-with-a-dynamic-string-parameter –

+0

這實際上是最好的方式。你可以用反射來做,但我不建議你這樣做。嘗試編寫高效的代碼,而不是簡化所有內容。 –

回答

4

使用反射是一個另類:

var sortOrder = "Group"; 

list = list.OrderBy(o => o.GetType().GetProperty(sortOrder).GetValue(o)).ToList(); 

請注意,如果您設置「中將sortOrder」到實際上並不存在的類屬性名稱,你會得到一個NullReferenceException。但是,如果你在控制價值,而不只是接受用戶輸入的內容(例如),那麼它會很好。

1

你將不得不使用反射。問題在於反射緩慢而難看。

list.OrderBy(o => o.GetType().GetProperty(sortOrder).GetValue(o)).ToList() 

對性能沒有太大的作用。爲了使它看起來更漂亮,你可以把它變成一個擴展方法:

public static IEnumerable<T> OrderByPropertyName<T>(this IEnumerable<T> source, string propertyName) 
{ 
    var property = typeof(T).GetProperty(propertyName); 

    if (property == null) return source; // or throw exception 
    else return source.OrderBy(x => property.GetValue(x)); 
} 

然後用它作爲

list.OrderByPropertyName(sortOrder) 

它比第一反射方法稍快,因爲GetProperty只調用一次。如果屬性不存在,您還可以控制行爲。

在我看來,int這個例子switch比反射要好。