В моем текущем проекте я делаю тяжелое отражение, и я пытаюсь предоставить несколько вспомогательных методов, чтобы все было аккуратно.
Я хотел бы предоставить пару методов, чтобы определить, реализует ли тип или экземпляр 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.
Я, наверное, просто пропустил что-то довольно очевидное - может ли кто-нибудь указать мне в правильном направлении?