2016-10-24 25 views
-2

使用來自枚舉的反射來從id獲取名稱。我使用的是:如何在C#中使用Linq和Reflection?

foreach(string idValue in Values) 
{ 
    var listSource = itemsSource as IEnumerable; 
    Type listType = listSource.GetType().GenericTypeArguments[0] 
    PropertyInfo idProperty = listType.GetType().GetProperty("Id"); 
    PropertyInfo nameProperty = listType.GetType().GetProperty("Name"); 

    foreach (var listItem in listSource) 
    { 
     if (idValue.Equals(idProperty.GetValue(listItem, null).ToString())) 
     { 
      value = nameProperty.GetValue(listItem, null).ToString(); 
      break; 
     } 
    } 
    //do something with value. 
} 

如何使用Linq與反思,讓我不必通過在外環「idValue」的每個值元素循環?

類似:

reflectionList.Select(x=> x.idProperty == idValue),並用它來獲取nameProperty

請幫助值。

+6

使用LINQ不會避免循環,它只是意味着你不需要寫出它們。 – Servy

+0

將使用添加到System.Linq? – Botonomous

+0

你的問題是什麼? _「如何將其轉換爲Linq」_? – CodeCaster

回答

0

這是無法測試的,因爲我真的不知道您使用的是什麼類型(特別是Values),也不是預期的結果。

value = listSource.Where(item => idValue.Equals(idProperty.GetValue(item, null).ToString())) 
    .Select(item => nameProperty.GetValue(item, null).ToString()) 
    .First(); 

我們首先得到所有的項目對應的if條件,然後通過nameProperty把它們翻譯成一個簡單的字符串,然後檢索只有第一個(這也應該是唯一的)字符串項。

+0

感謝您的回覆。問題是我無法使用。甚至在使用System.Linq之後還是Linq。這可能是因爲IEnumerable類型在這一點上是未知的。 – Jeevan

+0

你在你自己的代碼中清楚地使用了'IEnumerable',所以這不成問題。你得到的錯誤是什麼? – Kilazur