Version plus rapide de Convert.ChangeType
Dans une application que j'ai, je fais assez souvent des appels à Convert.ChangeType
afin de convertir une valeur d'un chargé dynamiquement type.
Cependant, après profilage avec des FOURMIS, j'ai trouvé que cette Convert.ChangeType
semble prendre une partie significative de temps (en raison d'être appelé très souvent). Quelqu'un aurait-il une alternative plus rapide à faire cela?
À ce point, j'ai un type d'objet contenant la cible, et un string
contenant la valeur.
Ce qui suit est le code incriminé. J'envisage de faire un interrupteur d'instruction sur le type (puisque c'est une collection limitée de types) et de l'appel de l'analyse des méthodes, même si je ne suis pas sûr de savoir si ou non ce sera plus rapide.
if(attributeRow["Value"]!=DBNull.Value)
sample[attr] = attr.AttributeType == typeof(Guid)
? new Guid(attributeRow["Value"].ToString())
: (IComparable)Convert.ChangeType(attributeRow["Value"],attr.AttributeType);
source d'informationauteur Erich
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas au courant de tout d'autres fonctionnalités dans le cadre lui-même pour changer les Types autres que l'
Convert.ChangeType
fonction (et conversions explicites, bien évidemment).Pour cela, je pense que la seule autre façon d'améliorer ce qui est de rouler vos propres
ChangeType
fonction qui est spécifiquement optimisé pour votre situation particulière (si possible).Vous mentionnez que vous travaillez avec un nombre limité de Types, peut-être que vous avez affaire à un Type plus que les autres? Est le cas, votre
ChangeType
fonction pourrait être optimisée pour cette tentative de conversion en premier, et seulement en essayant d'autres faute de. Vous mentionnez essayer un commutateur de style bloc de code, et c'est la même approche (en essayant le plus fréquemment utilisé Type de première) pourrait être appliquée. Quant à savoir s'il sera plus rapide dépendra de vos données que vous traitiez (la fréquence et la variabilité des Types de vous convertir à/de) et le seul véritable moyen de mesurer ce qui est de l'essayer et de profil, en comparaison avec laConvert.ChangeType
méthodologie.Un lien intéressant si vous êtes à la recherche pour rouler fonctionnalité est sur Peter Johnson blog:
Convertir des.ChangeType ne gère pas les nullable
Assurez-vous de lire tous les commentaires à ce poste également.
C'est ma version de un plus rapide ChangeType. Je suppose que le principe est le même que suggéré par @CraigTP, cependant, il ne fonctionne que pour les valeurs null types de valeur.
Je suis fonde mes convertir méthode sur le fait qu'il est plus probable que le type de valeur sera compatible avec le type de cible est d'une certaine façon. Mais cette méthode n'a pas été conçu pour la performance, il a été conçu pour être pratique. Ce n'est pas quelque chose que j'avais envie de l'appeler à partir de l'intérieur d'une boucle.
Je suis toujours retomber sur ChangeType mais j'essaie d'opter pour la dès que possible.
Vous pourriez rouler vos propres
ChangeType
fonction qui ne statique C-style casting. Ce serait mon approche.Je n'ai pas testé si vite, mais c'est une voie alternative pour la dynamique de la coulée. C'est alsp plus universelle, car
Convert.ChangeType()
a quelques limitations, comme vous l'avez vu (Guid, les types Nullables)