2010-01-15 10 views
6

en mi código usando reflexiones que escribíVersión implícita de IsAssignableFrom?

if (f.FieldType.IsAssignableFrom("".GetType())) 

tengo una clase que tiene una conversión implícita de cadenas. Sin embargo, la instrucción if anterior no la capta. ¿Cómo puedo hacer reflection/the above if statement catch cadenas y clases con conversión de cadena implícita? en lugar de cadenas específicas y cada clase que conozco?

Respuesta

7

Utilizaría un método de extensión que obtiene todos los métodos públicos estáticos y comprueba un método con el nombre correcto y el tipo de devolución.

public static class TypeExtentions 
{ 
    public static bool ImplicitlyConvertsTo(this Type type, Type destinationType) 
    { 

     if (type == destinationType) 
      return true; 


     return (from method in type.GetMethods(BindingFlags.Static | 
               BindingFlags.Public) 
       where method.Name == "op_Implicit" && 
         method.ReturnType == destinationType 
       select method 
       ).Count() > 0; 
    } 
} 
+3

Sí. Los operadores de conversión implícita son solo azúcar sintáctico. No tienen ningún significado especial para CLR, y VB.NET ni siquiera los entiende (o al menos no lo hizo en el pasado). No es un elenco verdadero, y por lo tanto no es realmente asignable; la única respuesta es verificar realmente el operador implícito. – Aaronaught

0
if(... || TypeDescriptor.GetConverter(f).CanConvertTo("".GetType())) 
+0

El problema aquí es que parece convertir TODO en una cadena. Incluyendo clases no implícitas. El hecho de que convierte clases en una cadena arruina mi código. –

+0

Por definición, TODOS los objetos implementan un método ToString(). – Curt

Cuestiones relacionadas