2015-07-20 1 views
3

Je ne comprends pas pourquoi le cadre expose AppSettingsReader.GetValue, qui est la signature:Quel est le point dans lequel AppSettingsReader demande le type de la valeur et renvoie un objet de type non spécifique?

public object GetValue(string key, Type type); 

demande pour le type de la valeur de réglage, et retourne un non casté object?! À quoi bon demander le type et ne pas exposer une valeur castée générique?!

Je me demande pourquoi ils n'ont pas "terminer" le travail.

Si nous parlons déjà de finir le travail, peut-être ce qui suit devrait être ce que nous voulons:

public T GetValue<T>(string key, T defaultValue = default(T)) where T : class 
{ 
    object value = _appSettingsReader.GetValue(key, typeof(T)); 
    T castedValue; 
    try 
    { 
     castedValue = (T) Convert.ChangeType(value, typeof(T)); 
    } 
    catch (Exception) 
    { 
     castedValue = defaultValue; 
    } 

    return castedValue; 
} 
+0

Le '... comme T' pourrait simplement être' (T) ... '. –

+0

Je sais ... Je pense personnellement que cela rend l'intention plus claire. Mais c'est maintenant difficile ... :) – Veverke

+1

@PatrickHofman: vous avez fait un bon point. Il y a une différence entre les deux, et c'est exactement ce que je cherchais (sur un problème différent). Lancer avec "as" nécessite que le type générique soit une classe, tout en utilisant (T) non. En d'autres termes, l'utilisation de "as" dans la solution signifiait qu'elle excluait les types de structure, tels que le double. Donc, la solution n'était pas aussi générique que je le voulais. – Veverke

Répondre

3

Quel est le point de demander le type et ne pas exposer une valeur casted de type générique ?!

Eh bien, je suppose qu'ils ont écrit ce code avant l'ère des génériques. Cette méthode était là depuis. NET 1.1, donc définitivement pré-génériques.

Le fait de demander le type est que derrière cette méthode, il convertit la valeur au bon type. Ce n'est tout simplement pas exposé au monde extérieur. Il doit savoir lire le XML et le convertir en un type spécifique.

Bien sûr, ils pourraient (et peut-être devraient) réécrire ce code afin qu'il utilise des génériques. Cela nous profiterait à tous.

+0

Je sais qu'ils le demandent pour une raison - et j'ai deviné qu'ils jouent un rôle dans les internes. Considérant l'ère pré-générique, y a-t-il vraiment beaucoup de gain pour une telle chose? Je veux dire, la méthode "vous épargne" du travail de casting? Pas complètement ... – Veverke

+0

Il empêche les erreurs car il suffit d'écrire le type une fois au lieu de deux fois. –

+0

Eh bien ... ok, ce n'est pas parfait mais ils ont fait ce qu'ils avaient à faire. :-) Ils devraient certainement changer cela, cependant. – Veverke