反射

2013-02-22 75 views
0

過程中訪問的基本類型與LINQ我有我自己的小應用程序在http://projecteuler.net落實的問題的解決方案。我有一個名爲ProblemBase的基類,它包含有關這些問題的元信息,例如它們的id,名稱和說明文本以及求解器函數。然後,每個問題的實現都來自這個類。反射

實現的列表現在變得相當大,所以不是手動維護溶液容器中,我走進了反映土地的第一次。這個想法是在我的程序集中找到從ProblemBase派生的所有類型,並將它們實例化爲應用程序的問題枚舉(下面的代碼中的​​),以便我可以從我的GUI與它們交互。這是我目前的實施:

private void FindProblemTypes() 
    { 
     var problemBaseType = typeof(ProblemBase); 
     var problemTypes = (from t in Assembly.GetAssembly(problemBaseType).GetTypes() 
          where t != problemBaseType && problemBaseType.IsAssignableFrom(t) 
          select t).ToList(); 

     Problems = new ObservableCollection<ProblemBase>(); 
     foreach (var problemType in problemTypes) 
     { 
      Problems.Add((ProblemBase)Activator.CreateInstance(problemType)); 
     } 

     Problems = new ObservableCollection<ProblemBase>(Problems.OrderBy(t => t.Id)); 
    } 

它的工作,但我想清理它了一下。現在,我首先創建一個派生類型的列表,然後將它們安裝到我的集合中,然後創建另一個集合以通過它們的id來排序這些類型。我想要做的是直接從第一個LINQ集合創建我的ObservableCollection。我想只要在LINQ語句添加orderby t.Id,但由於類型集合包含System.Type對象而不是ProblemBase對象,屬性是不可用的,我不能變量轉換爲LINQ查詢在我的基本對象。我假設這是因爲我所請求的類型信息在編譯時並不知道,但有沒有其他方式可以將它看作查詢中的ProblemBase對象?還是我必須堅持我擁有的?

回答

0
var problemTypes = (from t in Assembly.GetAssembly(problemBaseType).GetTypes() 
    where t != problemBaseType && problemBaseType.IsAssignableFrom(t) 
    select (ProblemBase)Activator.CreateInstance(t)).ToList().OrderBy(t => t.Id); 

這樣會行嗎?你仍然需要AddRange把它放到你的集合中,但是不會遍歷它們,所以沒關係。我不是LINQ中最好的,所以你可能想要測試一下。

我不認爲你永遠可以堵塞你的「排序依據ID」到原始查詢的習慣已經由然後創建項目。

+0

工作,我忘記了我可以直接從Select語句做東西。我現在直接從查詢返回的列表中創建ObservableCollection。謝謝! :) – 2013-02-23 00:13:37