Определите, является ли объектом какой-либо Предикат <T>

Я имею IList<Delegate> это содержит некоторых Func<bool>s и некоторые Predicate<T>s, где T варьируется. Я позже должен разобраться, какой из этих объектов является Predicate<T>s, но не хочу отрезать путь к добавлению другого Delegate типы к списку позже, таким образом, я не хочу делать это путем идентификации объектов !(current_delegate is Func<bool>).

Самая высокая абстракция ниже Predicate<T> MulticastDelegate, тому, которое кажется бесполезным (был бы нужен недженерик Predicate введите под Predicate<T>), и идентификация присутствия универсального параметра также бесполезна, учитывая другой дженерик Delegates, который может присутствовать в списке.

Единственная другая вещь, которую я рассмотрел, проверяет Name из Type. Мне сравнение строк является почти запахом, но возможно который является лучшего и/или только пути - Вы говорите мне.

Что лучший способ состоит в том, чтобы окончательно решить что object любой Predicate<T> не зная тип T?

8
задан Jay 23 February 2010 в 17:11
поделиться

4 ответа

Вот так:

obj.GetType().GetGenericTypeDefinition() == typeof(Predicate<>)
8
ответ дан 5 December 2019 в 17:36
поделиться
Predicate<int> pred = ...;
var isPreidcate = pred.GetType().GetGenericTypeDefinition() == typeof(Predicate<>);

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

2
ответ дан 5 December 2019 в 17:36
поделиться

У вас может быть список специальных классов, которые объединяют ваши делегаты и предоставляют дополнительную информацию для сортировки. Так вы решите проблему косвенно.

0
ответ дан 5 December 2019 в 17:36
поделиться

Это должно работать хорошо Достаточно:

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 
0
ответ дан 5 December 2019 в 17:36
поделиться
Другие вопросы по тегам:

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