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));
3 Réponses :
Le code ci-dessous fonctionne bien avec la conversion vers le GUID. Vérifiez-le
id = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(text);
Si t code> sera soit
GUID code> ou
int32 code> alors ce n'est pas vraiment em> très générique, est-ce? Écrivez simplement deux méthodes à la place - avec des noms différents ou éventuellement em> 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. P>
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 i> de la mise en œuvre.
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); }