Определите, имеет ли набор тип IEnumerable <T>

Resharper. Это - лучший инструмент для повышения производительности для любого разработчика программного обеспечения! TestDriven. Сеть довольно хороша также. и GhostDoc.

52
задан Piotr Justyna 21 November 2012 в 02:41
поделиться

6 ответов

Если вы имеете в виду коллекцию , то просто как :

var asEnumerable = i as IEnumerable<int>;
if(asEnumerable != null) { ... }

Однако я m при условии (из примера), что у вас есть Тип :

Объект никогда не будет иметь тип IEnumerable - но он может реализовать его; Я ожидал, что:

if(typeof(IEnumerable<int>).IsAssignableFrom(type)) {...}

подойдет. Если вы не знаете T ( int в приведенном выше), то проверьте все реализованные интерфейсы:

static Type GetEnumerableType(Type type) {
    foreach (Type intType in type.GetInterfaces()) {
        if (intType.IsGenericType
            && intType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) {
            return intType.GetGenericArguments()[0];
        }
    }
    return null;
}

и вызовите:

Type t = GetEnumerableType(type);

, если это значение null, это не 't IEnumerable для любого T - в противном случае проверьте t .

101
ответ дан 7 November 2019 в 09:06
поделиться

Тот же метод, что и в ответе Марка, но Linqier:

namespace NS
{
    class Program
    {
        static IEnumerable<int> GetInts()
        {
            yield return 1;
        }

        static void Main()
        {
            var i = GetInts();
            var type = i.GetType();
            var isEnumerableOfT = type.GetInterfaces()
                .Any(ti => ti.IsGenericType
                     && ti.GetGenericTypeDefinition() == typeof(IEnumerable<>));
            Console.WriteLine(isEnumerableOfT);
        }
    }
}
14
ответ дан 7 November 2019 в 09:06
поделиться

Как определить, относится ли объект к типу IEnumerable ?

Пожалуйста, не стесняйтесь использовать этот прекрасный, сверхмалый, универсальный метод расширения, чтобы определить, реализует ли какой-либо объект интерфейс IEnumerable. Он расширяет тип Object , поэтому вы можете выполнить его, используя любой экземпляр любого объекта, который вы используете.

public static class CollectionTestClass
{
    public static Boolean IsEnumerable<T>(this Object testedObject)
    {
        return (testedObject is IEnumerable<T>);
    }
}
7
ответ дан 7 November 2019 в 09:06
поделиться

i имеет тип NS.1.Program + d__0 , который является подтипом из IEnumerable . Таким образом, вы можете использовать либо

if (i is IEnumerable<int>) { ... }

, либо IsAssignableFrom (как в ответе Марка).

4
ответ дан 7 November 2019 в 09:06
поделиться

Вы можете использовать ключевое слово is .

[TestFixture]
class Program
{
    static IEnumerable<int> GetInts()
    {
        yield return 1;
    }

    [Test]
    static void Maasd()
    {
        var i = GetInts();
        Assert.IsTrue(i is IEnumerable<int>);
    }
}
1
ответ дан 7 November 2019 в 09:06
поделиться
0
ответ дан 7 November 2019 в 09:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: