2012-03-05 75 views
0

我有一個方法,返回一個類型爲T的元素列表。我想參數化IEnumerator迭代的元素(在這種情況下,它是硬編碼的myCanvas),但是我無知如何去做。任何幫助將不勝感激。IEnumerator和泛型

public List<T> GetUIElements<T>() where T : DependencyObject 
{ 
    List<T> elementList = new List<T>(); 

    System.Collections.IEnumerator ie = myCanvas.Children.GetEnumerator(); 
    while (ie.MoveNext()) 
    { 
     if (ie.Current.GetType() == typeof(T)) 
     { 
      elementList.Add((T)ie.Current); 
     } 
    } 
    return elementList; 
} 
+0

uhm不嚴格WPF相關 – 2012-03-05 11:00:13

回答

0

Panel.Children屬性是UIElementCollection類型,這是一個IEnumerable的。

這意味着你可以重寫方法:

public List<T> GetUIElements<T>(IEnumerable collection) where T : DependencyObject 
    { 
     return collection.OfType<T>().ToList(); 
    } 

然後調用它:List<MyType> list = GetUIElements<MyType>(myCanvas.Children);

要約束它更多的(我可以從方法名稱派生),你可以改變簽名:

public List<T> GetUIElements<T>(UIElementCollection collection) where T : UIElement 
+0

非常感謝。那正是我期待的! – Accu 2012-03-05 11:43:56

0

做你嘗試用:

foreach (T obj in myCanvas.Children.OfType<T>()) 
    { 
       ... 
    } 
0

首先,和道歉,這不回答你的問題,你可以爲自己省下不少麻煩,寫更好的代碼是這樣的:

using System.Linq; 

public IEnumerable<T> GetUIElements<T>() where T : DependencyObject 
{ 
    return myCanvas.Children.OfType<T>(); 
} 

一旦代碼是這種形式,你可以看到,我們實在沒有必要功能好,所以你原來的問題可能不再適用。

如果你還需要參數myCanvas,這裏有好消息和壞消息。壞消息是,你絕對需要找到一個具有Children屬性的基類,並且WPF控制層次結構不是最純粹的。可能會有控制暴露Children屬性彼此不相關,在這種情況下,你可以做很多事情(你可以傳入DependencyObject並開始類型轉換,但這真的很髒)。

好消息是,有非常好的LINQ到WPF樹adapters在那裏可以做到這一點,以及更多,而無需編寫代碼。

+0

您不應直接訪問Children屬性,Panel和派生類中有多個UIElementCollection屬性。 – Bas 2012-03-05 11:14:52