Я имею IList<Delegate>
это содержит некоторых Func<bool>
s и некоторые Predicate<T>
s, где T
варьируется. Я позже должен разобраться, какой из этих объектов является Predicate<T>
s, но не хочу отрезать путь к добавлению другого Delegate
типы к списку позже, таким образом, я не хочу делать это путем идентификации объектов !(current_delegate is Func<bool>)
.
Самая высокая абстракция ниже Predicate<T>
MulticastDelegate
, тому, которое кажется бесполезным (был бы нужен недженерик Predicate
введите под Predicate<T>
), и идентификация присутствия универсального параметра также бесполезна, учитывая другой дженерик Delegate
s, который может присутствовать в списке.
Единственная другая вещь, которую я рассмотрел, проверяет Name
из Type
. Мне сравнение строк является почти запахом, но возможно который является лучшего и/или только пути - Вы говорите мне.
Что лучший способ состоит в том, чтобы окончательно решить что object
любой Predicate<T>
не зная тип T
?
Вот так:
obj.GetType().GetGenericTypeDefinition() == typeof(Predicate<>)
Predicate<int> pred = ...;
var isPreidcate = pred.GetType().GetGenericTypeDefinition() == typeof(Predicate<>);
С другой стороны, если у вас есть общий список, вам не нужно проверять типы в нем. Возможно, вы захотите переосмыслить свой дизайн, если вам нужно проверить определенные типы в списке.
У вас может быть список специальных классов, которые объединяют ваши делегаты и предоставляют дополнительную информацию для сортировки. Так вы решите проблему косвенно.
Это должно работать хорошо Достаточно:
public static bool IsPredicate(object obj) {
var ty = obj.GetType();
var invoke = ty.GetMethod("Invoke");
return invoke != null && invoke.ReturnType == typeof(bool);
}
Уловка будет в том, что когда вы действительно хотите вызвать функцию, вам нужно будет использовать отражение.
Вот несколько тестов:
Func<bool> is pred? True
Func<int, bool> is pred? True
Predicate<int> is pred? True
Func<int> is pred? False