2010-10-03 3 views
5

La classe Convert existe depuis .NET 1.0. L'interface IConvertible existe également depuis cette date.Pourquoi Convert.ChangeType prend un paramètre d'objet?

La méthode Convert.ChangeTypeseulement de travaux sur les objets de types qui mettent en œuvre IConvertible (en fait, à moins que je me trompe, tous des méthodes de conversion fournies par la classe Convert sont de cette façon). Alors, pourquoi le type de paramètre est-il object?

En d'autres termes, au lieu de cela:

public object ChangeType(object value, Type conversionType); 

Pourquoi pas la signature cela?

public object ChangeType(IConvertible value, Type conversionType); 

Cela me semble étrange.

Répondre

5

regardant dans le réflecteur, vous pouvez voir le haut de ChangeType(object, Type, IFormatProvider), qui est ce qu'on appelle sous les couvertures:

public static object ChangeType(object value, Type conversionType, IFormatProvider provider) 
{ 
    //a few null checks... 
    IConvertible convertible = value as IConvertible; 
    if (convertible == null) 
    { 
    if (value.GetType() != conversionType) 
    { 
     throw new InvalidCastException(Environment.GetResourceString("InvalidCast_IConvertible")); 
    } 
    return value; 
    } 

il ressemble un objet d'un type qui n'a pas mettre en œuvre IConvertible mais déjà est le type de destination retournera simplement l'objet original.

Accordée il ressemble à ceci est la seule exception à la valeur besoin de mettre en œuvre IConvertible, mais il est une exception, et ressemble à la raison pour laquelle le paramètre est object à la place.


Voici un test rapide LINQPad pour ce cas:

void Main() 
{ 
    var t = new Test(); 
    var u = Convert.ChangeType(t, typeof(Test)); 
    (u is IConvertible).Dump(); //false, for demonstration only 
    u.Dump();      //dump of a value Test object 
} 

public class Test { 
    public string Bob; 
} 
+0

Je suppose que cela ne semble pas être la seule explication possible ... ne pas vous sembler bizarre, cependant, que les concepteurs aurait considéré le comportement "peut prendre un objet et le convertir au même type" mérite même d'être soutenu? Je veux dire, à quoi cela servirait-il? –

+0

@Dan - Je pense que ObjectDatasource l'utilise en interne IIRC, je suppose qu'ils ont préféré le contrôle à l'intérieur au lieu d'un à l'extérieur? Je suis d'accord que cela ne semble pas très utile. –

Questions connexes