2010-02-23 9 views
8

Tengo una IList<Delegate> que contiene algunos Func<bool> s y algunos Predicate<T> s, donde T varía. Más tarde necesito aclarar cuáles de estos elementos son Predicate<T> s, pero no quiero cerrar la puerta para agregar otros tipos de Delegate a la lista más adelante, así que no quiero hacer esto identificando objetos por !(current_delegate is Func<bool>).Determinar si el objeto es cualquier predicado <T>

El más alto de abstracción por debajo Predicate<T> es MulticastDelegate, que parece poco útil (necesitaría un no genérico Predicate tipo bajo Predicate<T>), y la identificación de la presencia del parámetro genérico también es inútil dadas las otras genéricos Delegate s que pueden estar presentes en la lista.

La única otra cosa que he considerado es verificar el Name del Type. Para mí, la comparación de cuerdas es casi un olor, pero tal vez esa es la mejor y/o única forma - díganme.

¿Cuál es la mejor manera de determinar definitivamente que un object es cualquier Predicate<T> sin conocer el tipo de T?

Respuesta

8

De esta manera:

obj.GetType().GetGenericTypeDefinition() == typeof(Predicate<>) 
+0

Perfección. Una de esas cosas que probablemente voy a encontrar un buen uso para al menos semanalmente. – Jay

+5

Sí, pero prepárate para atrapar la 'InvalidOperationException' que se lanzará para los tipos de delegados no genéricos, lo que parece una posibilidad futura. Para evitar la molestia, marca 'Type.IsGenericType' antes de llamar a este método. –

0

Puede tener una lista de clases especiales que envuelven a sus delegados y brindan información de clasificación adicional. Entonces, indirectamente resolverás el problema.

+0

Gracias; la lista se rellena al pasar expresiones lambda, lo que agregaría una complejidad significativa a la implementación de esto. – Jay

2
Predicate<int> pred = ...; 
var isPreidcate = pred.GetType().GetGenericTypeDefinition() == typeof(Predicate<>); 

Por otro lado, si usted tiene una lista genérica, que shoulnd't que compruebe los tipos en ella. Es posible que desee replantear su diseño si necesita verificar tipos específicos dentro de una lista.

0

Esto debería funcionar bastante bien:

public static bool IsPredicate(object obj) { 
    var ty = obj.GetType(); 
    var invoke = ty.GetMethod("Invoke"); 
    return invoke != null && invoke.ReturnType == typeof(bool); 
} 

El truco será cuando realmente se quiere llamar a la función, tendrá que utilizar la reflexión.

Estas son algunas pruebas:

Func<bool> is pred? True 
Func<int, bool> is pred? True 
Predicate<int> is pred? True 
Func<int> is pred? False 
Cuestiones relacionadas