Méthode générique Type de retour en tant que paramètre

J’ai une méthode d’extension qui fonctionne bien pour convertir les valeurs de chaîne en différents types, ce qui ressemble à ceci:

public static T ToType (this ssortingng value, T property) { object parsedValue = default(T); Type type = property.GetType(); try { parsedValue = Convert.ChangeType(value, type); } catch (ArgumentException e) { parsedValue = null; } return (T)parsedValue; } 

Je ne suis pas satisfait de l’apparence de cette méthode lors de l’appel de la méthode:

 myObject.someProperty = ssortingngData.ToType(myObject.someProperty); 

Spécifier la propriété juste pour obtenir le type de la propriété semble redondant. Je préférerais utiliser une signature comme celle-ci:

 public static T ToType (this ssortingng value, Type type) { ... } 

et ont fini par être le type de type. Cela rendrait les appels beaucoup plus propres:

 myObject.someProperty = ssortingngData.ToType(typeof(decimal)); 

Cependant, lorsque j’essaie d’appeler de cette façon, l’éditeur se plaint que le type de retour de la méthode d’extension ne peut pas être déduit de l’utilisation. Puis-je lier T à l’argument Type?

Qu’est-ce que je rate?

Merci

Est-ce ce que vous recherchez? J’ai ajouté une prise supplémentaire pour les cas où la dissortingbution n’est pas valide aussi

 Decimal i = ssortingngName.ToType(); public static T ToType(this ssortingng value) { object parsedValue = default(T); try { parsedValue = Convert.ChangeType(value, typeof(T)); } catch (InvalidCastException) { parsedValue = null; } catch (ArgumentException) { parsedValue = null; } return (T)parsedValue; } 

modifier

une approche de raccourci pour corriger le commentaire d’Anton

 if (typeof(T).IsValueType) return default(T); 

Pourquoi utiliser la propriété du tout? Modifiez simplement la façon dont vous définissez votre variable de type sur le type de votre générique.

  public static T ToType(this ssortingng value) { object parsedValue = default(T); Type type = typeof(T); try { parsedValue = Convert.ChangeType(value, type); } catch (ArgumentException e) { parsedValue = null; } return (T) parsedValue; } 

Usage:

 myObject.someProperty = ssortingngData.ToType() 

J’utilise ceci pour une conversion générique:

  public bool ConvertTo(object from, out T to) { to = default(T); if (from is T) { to = (T)from; return true; } Type t = typeof(T); //TypeConverter converter = p.converter == null ? TypeDescriptor.GetConverter(t) : p.converter; TypeConverter converter = TypeDescriptor.GetConverter(t); if ((converter != null) && (converter.CanConvertTo(t))) { try { to = (T)converter.ConvertTo(null, culture, from, t); return true; } catch { } } try { to = (T)Convert.ChangeType(from, t, culture); return true; } catch { } return false; } public bool ConvertTo(object from, out object to, Type type) { to = null; if (from.GetType() == type) { to = from; return true; } TypeConverter converter = TypeDescriptor.GetConverter(type); if ((converter != null) && (converter.CanConvertTo(type))) { try { to = converter.ConvertTo(null, culture, from, type); return true; } catch { } } try { to = Convert.ChangeType(from, type, culture); return true; } catch { } return false; } 

Avant d’appeler Convert.ChangeType , ceci vérifie s’il existe un TypeConverter pour la variable donnée.

Appelez ça comme ça:

 int i = 123; ssortingng s; if (ConvertTo(i, out s) { // use s }