2008-09-18 11 views
9

Comment convertir au mieux une valeur d'énumération System.Data.DbType en les valeurs System.Type correspondantes (ou au moins l'une des valeurs correspondantes possibles) System.Type?Comment convertir au mieux un DbType en System.Type?

Par exemple:

DbType.StringFixedLength -> System.String 
DbType.String -> System.String 
DbType.Int32 -> System.Int32 

Je n'ai vu des solutions très "sales", mais rien de vraiment propre.

(oui, il est un suivi à une autre question de la mienne, mais il était plus logique que deux questions séparées)

Répondre

6

AFAIK il n'y a pas de convertisseur intégré dans .NET pour convertir un SqlDbType à un système .Type. Mais connaissant la cartographie, vous pouvez facilement faire rouler votre propre convertisseur allant d'un simple dictionnaire à des solutions plus avancées (basées sur XML pour l'extensibilité).

La mise en correspondance peuvent être trouvés ici: http://www.carlprothman.net/Default.aspx?tabid=97

4

objets System.Data.SqlClient utiliser le composant métatype pour traduire DbType et SqlDbType aux types CLR .NET. En utilisant la réflexion, vous pouvez tirer parti de cette capacité si nécessaire:

var dbType = DbType.Currency; 

Type metaClrType = Type.GetType(
    "System.Data.SqlClient.MetaType, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 
    true, 
    true 
    ); 

object metaType = metaClrType.InvokeMember(
    "GetMetaTypeFromDbType", 
    BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.NonPublic, 
    null, 
    null, 
    new object[] { dbType } 
); 

var classType = (Type)metaClrType.InvokeMember(
    "ClassType", 
    BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic, 
    null, 
    metaType, 
    null 
); 

string cSharpDataType = classType.FullName; 
+0

Bien que cela semble fonctionner, je suppose qu'il est un appel sans papier qui peuvent ne pas être disponibles dans les versions ultérieures du cadre et/ou peuvent ne pas être disponibles sur non -Windows versions de .NET? –