Warum dauert Convert.ChangeType einen Objektparameter?
-
27-09-2019 - |
Frage
Die Convert
Klasse ist seit dem .NET in Existenz gewesen 1.0. Die IConvertible
Schnittstelle ist ebenfalls seit dieser Zeit existiert hat.
Die Convert.ChangeType
Methode nur Werke auf Objekte von Typen, die IConvertible
implementieren (in der Tat, es sei denn, ich irre, alle der Umwandlung durch die Convert
-Klasse Methoden sind auf diese Weise). Warum also ist der Parametertyp object
?
Mit anderen Worten, anstelle diesem:
public object ChangeType(object value, Type conversionType);
Warum ist nicht die Unterschrift das?
public object ChangeType(IConvertible value, Type conversionType);
Nur scheint mir fremd.
Lösung
Reflektor Suchen können Sie die Spitze ChangeType(object, Type, IFormatProvider)
sehen, was ist 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 ist es wie ein Objekt eines Typs sieht, dass nicht IConvertible
implementieren, aber schon ist der Zieltyp wird nur das ursprüngliche Objekt zurück.
Zugegeben sieht es aus wie das die nur Ausnahme auf den Wert, um IConvertible
zu implementieren, aber es ist eine Ausnahme, und sieht aus wie der Grund die Parameter object
statt.
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;
}