Определить, является ли объект любым Предикатом <T> - PullRequest
8 голосов
/ 23 февраля 2010

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

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

Единственное, что я рассмотрел, это проверка Name из Type. Для меня сравнение строк - это почти запах, но, может быть, это лучший и / или единственный способ - скажи мне.

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

Ответы [ 4 ]

8 голосов
/ 23 февраля 2010

Как это:

obj.GetType().GetGenericTypeDefinition() == typeof(Predicate<>)
2 голосов
/ 23 февраля 2010
Predicate<int> pred = ...;
var isPreidcate = pred.GetType().GetGenericTypeDefinition() == typeof(Predicate<>);

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

0 голосов
/ 23 февраля 2010

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

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 голосов
/ 23 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...