2010-01-15 7 views
6

In meinem Code mit Reflexionen schrieb iImplizite Version von IsAssignableFrom?

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

ich eine Klasse, die eine implizite Konvertierung in Zeichenfolgen hat. Die if-Anweisung oben fängt es jedoch nicht. Wie kann ich reflection/die obige if-Anweisung fangen Zeichenfolgen und Klassen mit impliziter String-Konvertierung? anstelle von Strings und jeder Klasse, die ich kenne?

Antwort

7

Ich würde eine Erweiterungsmethode verwenden, die alle öffentlichen statischen Methoden abruft und nach einer Methode mit dem korrekten Namen und Rückgabetyp sucht.

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

Yup. Implizite Konvertierungsoperatoren sind nur syntaktischer Zucker. Sie haben keine besondere Bedeutung für die CLR und VB.NET versteht sie nicht einmal (oder zumindest nicht in der Vergangenheit). Es ist keine echte Besetzung, und daher ist es nicht wirklich zuweisbar; Die einzige Antwort ist, tatsächlich nach dem impliziten Operator zu suchen. – Aaronaught

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

Problem hier ist es scheint alles in Zeichenfolge konvertiert. Nicht implizite Klassen einbeziehen. Die Tatsache, dass es Klassen in eine Zeichenfolge konvertiert, ruiniert meinen Code. –

+0

Per Definition definieren alle Objekte eine ToString() -Methode. – Curt

Verwandte Themen