IEnumerator и дженерики - PullRequest
       13

IEnumerator и дженерики

0 голосов
/ 05 марта 2012

У меня есть метод, который возвращает список элементов с типом T. Я хотел бы параметризовать элемент, через который итерирует IEnumerator (в данном случае это жестко закодированный myCanvas), но я не знаю, как сделай это. Любая помощь будет принята с благодарностью.

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;
}

Ответы [ 3 ]

0 голосов
/ 05 марта 2012

свойство 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 голосов
/ 05 марта 2012

Прежде всего, и извиняемся за то, что это не отвечает на ваш вопрос, вы можете сэкономить много хлопот и написать более качественный код, подобный этому:

using System.Linq;

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

Как только код в этой форме, вы можете увидетьчто в действительности нет никакой необходимости в какой-либо функции, поэтому ваш исходный вопрос может быть неприменим.

Если вам все еще нужно параметризировать myCanvas, есть хорошие и плохие новости.Плохая новость заключается в том, что вам абсолютно необходимо найти базовый класс со свойством Children, а иерархия элементов управления WPF не самая чистая.Вполне могут быть элементы управления, которые предоставляют Children свойства, которые не связаны друг с другом, и в этом случае вы не можете многое сделать (вы можете передать DependencyObject и начать приведение типов, но это действительно грязно).

Хорошая новость заключается в том, что есть очень хорошие LINQ-to-WPF-деревья адаптеры , которые могут это сделать, и многое другое, без необходимости писать код.

0 голосов
/ 05 марта 2012

вы пробовали с:

foreach (T obj in myCanvas.Children.OfType<T>())
  {
                ...
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...