2012-03-01 12 views
5

Belirli bir nesnenin belirli bir tür örneğine dönüştürülmesi için bir yöntem yazmaya çalışıyorum. Bunun ile başladı:C# Bazı genel döküm awesomeness Yardımı ile bana yardım

private static T TryCast<T>(object o) 
{ 
    return (T) o; 
} 

işe gitmiyor biliyoruz Gidiş, ama kavramını göstermektedir. Şimdi, string -> DateTime gibi otomatik olarak yayınlanmayan türlerim olduğunda sorun yaşamaya başlayacağım. Bu durumlarla başa çıkmak için Convert Class'ı kullanmaya çalışıyordum, ancak bir çalışma zamanı hatası yerine derleme zamanı hatası alıyorum. Aşağıdaki kod yazmak için türü 'dize' ifadesini döküm Can not derleme hatası" alır 'T'

private static T TryCast<T>(object o) 
{ 
    var typeName = typeof (T).FullName; 

    switch (typeName) 
    { 
     case "System.String": 
      return (T) Convert.ToString(o); 
     default: 
      return (T) o; 
    } 
} 

Ben de Convert.ChangeType() farkında değilim, ama kenar idare edecek merak ediyorum Ben aksi belirtilen dize gibi yukarıdaki anahtarı bakacaklarını durumlar -.? biri verebilir Eğer> normalde sadece için Convert.ToDateTime kullanmayı tercih ediyorum DateTime

private static T TryCast<T>(object o) 
{ 
    return (T)Convert.ChangeType(o, typeof(T)); 
} 

Yani, benim en iyi seçenek nedir bana çalışabilir bir yaklaşım, oradan alabilirim

+0

Tamam, biraz bağlam vermek için, bu yöntemin hemen kullanımı, bir DataRow nesnesindeki sütun değerlerinden T türünün bir örneğindeki özellikleri dinamik olarak atamaktır. Bir String , örnekte Key = özellik adının ve DatRow'daki Value = sütun adının geçmesini isterdim. PropertyInfos'u türünden almak ve örnek değerlerini ayarlamak için yazılan yansımam zaten var. Bu döküm bit, bulmacanın son parçası. Mümkün olduğu kadar tekrar kullanılabilir olmasını isterdim, ancak kapsamınızı benim örneğimle sınırlarsa, bunu kolaylaştırır. –

+0

Yukarıdaki 2. örnekte derleyici hatasının neden oluştuğunu ve neden olduğunu biliyorum. Ben sadece yaklaşımı göstermek için kullanıyorum, teşekkürler. Bu yeni değil: <) –

cevap

6

Convert.ChangeType kenar kasalarını kullanmalıdır; IConvertible için temsilciler.

Soruyu yanıtlamak için derleyici, T'un string olduğunu bilmez.
Bu nedenle, ilgisiz türler arasında geçiş yapmanıza izin vermez (tıpkı Button ürününü TextBox ürününe gönderemediğiniz gibi).

return (T)(object)o.ToString(); 

Şimdi, her bir dönüştürme derleyici (bir direk upcast veya doğrudan mahzun ya var) tarafından izin verilir, ve bütün biliyoruz:

İlk object için döküm yoluyla bu çalışabilirsiniz Bir şey işe yarayacaktır çünkü TString.

+0

Neden bunu düşünmedim? Herkesin ne dediğini görelim, ama bu kabul edilen cevap olabilir. –