12
votes

Convertir la valeur de la chaîne en type générique qui est soit GUID ou INT

J'ai une méthode générique qui convertit un identifiant d'une chaîne (par exemple, extrait de la valeur d'un champ de cache sur un formulaire ASP.NET) à un type cible et fait quelque chose avec elle.

var id = default(T);
if (id is Guid)
    id = new Guid(rawId);
else
    id = (T)Convert.ChangeType(rawId, typeof(T));


0 commentaires

3 Réponses :


26
votes

Le code ci-dessous fonctionne bien avec la conversion vers le GUID. Vérifiez-le

id = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(text);


0 commentaires

3
votes

Si t sera soit GUID ou int32 alors ce n'est pas vraiment très générique, est-ce? Écrivez simplement deux méthodes à la place - avec des noms différents ou éventuellement surcharges. Je ne vois pas l'avantage d'utiliser des génériques ici, et cela peut très bien rendre votre code plus compliqué qu'il n'a besoin d'être.


2 commentaires

Vous avez raison, mais c'est un exemple artificiel, il y a plus de cette méthode et simplifie les choses dans le contexte plus large de ce que je fais.


@Veli: C'est pourquoi cela vaut la peine d'être prudent lorsque vous écrivez une question et donnez une photo représentative. Je voudrais toujours envisager de le diviser en deux méthodes publiques non génériques qui pourraient utiliser une méthode privée générique courante comme partie de la mise en œuvre.



1
votes

Vous pouvez essayer quelque chose comme ceci peut-être:

private void MyMethod<T>(string rawId, Action<T> doSomethingWithId)
{
    T id = (T)Activator.CreateInstance(typeof(T), new object[] { rawId });
    doSomethingWithId(id);
}


0 commentaires