Убедитесь, что все элементы в списке <T>имеют тип T - PullRequest
1 голос
/ 11 января 2012

Я хочу убедиться, что все типы элементов List<T> T.

Я могу иметь List<object> содержащий объект, строку, int, Product, Supplier и т. Д.В моем случае, если List<T> было определено как List<object>, все элементы должны быть объектами.

То есть я хочу убедиться, что тип элементов - это точный тип передаваемого в универсальном типе, а не что-либо еще в цепочке наследования.Пример:

public void Foo<T>(List<T> list)
{
    // if not all elements are of type T (not SubClass of T) throw exception

    //...    
}

Как лучше?

Ответы [ 4 ]

8 голосов
/ 11 января 2012

Предполагая, что T является базовым классом, вы хотите запретить производные классы.

if(list.Any(element => element.GetType() != typeof(T))
    throw new ArgumentException();
2 голосов
/ 11 января 2012

Я думаю, что-то вроде того, что вы ищете:

public static Boolean AssertNoSubtypes<T>(List<T> items) {
    return items.All(i=>i.GetType().Equals(typeof(T)));
}
0 голосов
/ 11 января 2012

Я согласен с Одедом, но если вы хотите быть уверенным или относиться к каждому элементу самостоятельно, вы можете использовать foreach.

foreach(object item in list)
{
    //whatever you want
}

Вы можете добавить случайное количество объектов и поставить точку останова в этой строке, так что посчитайте сами, сколько раз оно было введено .... или просто объявите счетчик и проверьте, имеет ли оно то же количество добавленных вами элементов.

0 голосов
/ 11 января 2012

Точный тип можно проверить с помощью typeof и Object.GetType(). Например:

foreach(T item in list)
{
    if(! typeof(T).Equals(item.GetType())
    {
        /* Throw */
    }
}
...