2010-10-03 9 views
5

Die Klasse Convert existiert seit .NET 1.0. Die Schnittstelle IConvertible existiert seit dieser Zeit ebenfalls.Warum übernimmt Convert.ChangeType einen Objektparameter?

Die Convert.ChangeType Methode nur Arbeiten an Objekten von Typen, die IConvertible implementieren (in der Tat, es sei denn, ich irre, alle der Konvertierungsmethoden zur Verfügung gestellt von der Convert Klasse sind auf diese Weise). Warum ist der Parametertyp object?

Mit anderen Worten, statt dies:

public object ChangeType(object value, Type conversionType); 

Warum ist nicht die Unterschrift das?

public object ChangeType(IConvertible value, Type conversionType); 

scheint mir nur seltsam.

Antwort

5

in Reflektor Suchen können Sie die Spitze ChangeType(object, Type, IFormatProvider) finden das, was unter der Decke genannt:

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; 
    } 

So sieht es aus wie ein Objekt eines Typs, der nicht implementieren IConvertible aber bereits ist der Zieltyp wird nur das ursprüngliche Objekt zurückgeben.

Zugegeben, es sieht aus wie dies die nur Ausnahme von dem Wert ist, um IConvertible zu implementieren, aber es ist eine Ausnahme, und sieht aus wie der Grund der Parameter object stattdessen ist.


Hier ist ein schneller LinqPad Test für diesen Fall:

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

Ich denke, dies ist die einzig mögliche Erklärung zu sein scheint ... es nicht seltsam scheinen Sie aber, dass die Designer Hätte das Verhalten "kann ein Objekt nehmen und es auf den gleichen Typ umwandeln" sogar wert, unterstützt zu werden? Ich meine, wofür würde das jemals verwendet werden? –

+0

@Dan - Ich denke, ObjectDatasource verwendet es intern IIRC, ich denke, sie bevorzugten die Überprüfung innen statt einer außerhalb? Ich stimme zu, dass es nicht sehr nützlich scheint. –

Verwandte Themen