2010-10-03 19 views
5

Convert sınıfı .NET 1.0'dan beri var olmuştur. Bu zamandan beri IConvertible arayüzü de mevcut.Neden Convert.ChangeType bir nesne parametresi alır?

Convert.ChangeType yöntem (Convert sınıfı tarafından sağlanan dönüşüm yöntemlerinin tüm bu yoludur yanılmıyorsam aslında, sürece) IConvertible uygulamak türlerinin nesneler üzerinde sadece çalışır. Peki neden parametre türü object? bunun yerine başka deyişle

:

public object ChangeType(object value, Type conversionType); 

Neden bu imza değil mi?

public object ChangeType(IConvertible value, Type conversionType); 

Sadece bana tuhaf geliyor. reflektör baktığında

cevap

5

kapakların altında adlandırılan şeydir ChangeType(object, Type, IFormatProvider) üst görebilirsiniz:

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

Yani uygulamıyor bir türünde bir nesne gibi görünüyor IConvertible ama zaten ise, hedef tür yalnızca orijinal nesneyi döndürecektir.

bu IConvertible uygulamaya gerek değere sadece istisnası gibi görünüyor Verilen, ama bir istisnadır ve parametre yerine object olan sebep gibi görünüyor. tasarımcılara, yine de bunu tuhaf görünüyor gelmez ... Bu tek açıklaması olarak görünüyor tahmin

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

: Burada


bu durum için hızlı bir linqpad testi var "Bir nesneyi alabilir ve onu aynı türe dönüştürebilir" davranışını bile dikkate almaya değer miydi? Demek istediğim, bu ne için kullanılır? –

+0

@Dan - Bence ObjectDatasource bunu dahili olarak IIRC kullanıyor, sanırım bir çek yerine içeride kontrolü tercih ettiler mi? Katılıyorum, çok kullanışlı görünmüyor. –

İlgili konular