Подтвердить что ты не робот

Проверка того, реализует ли тип или экземпляр IEnumerable независимо от типа T

В моем текущем проекте я делаю тяжелое отражение, и я пытаюсь предоставить несколько вспомогательных методов, чтобы все было аккуратно.

Я хотел бы предоставить пару методов, чтобы определить, реализует ли тип или экземпляр IEnumerable - независимо от типа T. Вот что я имею на данный момент:

public static bool IsEnumerable(this Type type)
{
    return (type is IEnumerable);
}

public static bool IsEnumerable(this object obj)
{
    return (obj as IEnumerable != null);
}

Когда я тестирую их, используя:

Debug.WriteLine("Type IEnumerable:   " + typeof(IEnumerable).IsEnumerable());
Debug.WriteLine("Type IEnumerable<>: " + typeof(IEnumerable<string>).IsEnumerable());
Debug.WriteLine("Type List:          " + typeof(List<string>).IsEnumerable());
Debug.WriteLine("Type string:        " + typeof(string).IsEnumerable());
Debug.WriteLine("Type DateTime:      " + typeof(DateTime).IsEnumerable());
Debug.WriteLine("Instance List:      " + new List<string>().IsEnumerable());
Debug.WriteLine("Instance string:    " + "".IsEnumerable());
Debug.WriteLine("Instance DateTime:  " + new DateTime().IsEnumerable());

Я получаю это как результат:

Type IEnumerable:   False
Type IEnumerable<>: False
Type List:          False
Type string:        False
Type DateTime:      False
Instance List:      True
Instance string:    True
Instance DateTime:  False

Метод типа не работает вообще - я ожидал, что истинно для прямого совпадения System.Collections.IEnumerable.

Я знаю, что строка технически перечислима, хотя и с несколькими оговорками. В идеале в этом случае мне нужен вспомогательный метод, чтобы вернуть false для него. Мне просто нужны экземпляры с определенным типом IEnumerable<T> для возврата true.

Я, наверное, просто пропустил что-то довольно очевидное - может ли кто-нибудь указать мне в правильном направлении?

4b9b3361

Ответ 1

Следующая строка

return (type is IEnumerable);

спрашивает: "Если экземпляр Type, Type - IEnumerable", что явно не так.

Вы хотите сделать это:

return typeof(IEnumerable).IsAssignableFrom(type);

Ответ 2

В дополнение к Type.IsAssignableFrom(Type) вы также можете использовать Type.GetInterfaces():

public static void ImplementsInterface(this Type type, Type interface)
{
    bool implemented = type.GetInterfaces().Contains(interface);
    return implemented;
}

Таким образом, если вы хотите проверить несколько интерфейсов, вы можете легко изменить ImplementsInterface, чтобы использовать несколько интерфейсов.