Как насчет метода расширения?
public static bool HasAny(this IEnumerable source, Type type) {
foreach (object item in source)
if (item != null && item.GetType().Equals(type))
return true;
return false;
}
Использование:
bool hasDataType1 = myList.HasAny(typeof(MyObject<datatype1>));
Обратите внимание, что если вы не хотите вводить typeof(...)
, т. Е. Если вы хотите, чтобы ваш Exist
метод только заботился об объектах типа MyObject<T>
, я пошел бы с чем-то вроде ответа SLaks:
public static bool Exist<T>(this IEnumerable source) {
return source.OfType<MyObject<T>>().Any();
}
Кроме того, SLaks прав, что вы действительно не можете иметь List<MyObject<object>>
, который полон чего-либо, кроме объектов типа MyObject<object>
или некоторого производного класса (и MyObject<datatype1>
и т. Д. Делают не происходят от MyObject<object>
- генерики так не работают).
Другой способ, с помощью которого я мог бы предложить обойти всю проблему «вы не можете получить тип универсального класса, используя объект System.Type
без использования отражения», заключается в следующем: заставить ваш MyObject<T>
реализовать неуниверсальный интерфейс, как это:
public interface IMyObject {
Type DataType { get; }
}
public class MyObject<T> : IMyObject<T>, IMyObject {
public Type DataType {
get { return typeof(T); }
}
}
Тогда ваш список может быть List<IMyObject>
(неуниверсальный интерфейс), а ваш Exist
метод может выглядеть следующим образом:
public static bool Exist<T>(this IEnumerable source, Type type) {
return source.OfType<IMyObject>().Any(x => x.DataType.Equals(type));
}