2008-12-26 17 views
31

Aşağıdaki kod var çalışmak için görünmüyor. Ben Guid dönüştürmek mümkün olmak istiyorum ama hata almaya devam: Bu ilkel veri türleri ile mükemmel çalışıyorJenerik dönüşüm fonksiyonu GUID'lerini

Invalid cast from System.String to System.Guid

.
'un herhangi bir yolu, bu ilkel olmayan veri türleri için'u işe yarar mı?

cevap

82

ne dersiniz:

T t = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(text); 

İşleri Guid için cezası ve diğer birçok türleri.

+4

ConvertFromInvariantString kullanarak dikkatli olun. Eğer türünüz bir DateTime ise ve uluslararası tarih formatlarınız varsa, bu durum patlayacaktır. Bu cevaba dayanan gerçekten zor bir bulmacayı izledim. –

+0

@DPeden, onlar eşleşmelidir - benim kullanımım, seri hale getirilmiş verilerin genellikle değişmez bir biçimde –

+0

Yep olarak kabul edileceği varsayımına göre değişmezdir. Cevabınızı hala çok yararlı olduğu için savundum. Sadece bu yanma beni başkaları için yaktığını gösteriyor. –

0

Bu deneyin:

public object ChangeType(object value, Type type) 
    { 
     if (value == null && type.IsGenericType) return Activator.CreateInstance(type); 
     if (value == null) return null; 
     if (type == value.GetType()) return value; 
     if (type.IsEnum) 
     { 
      if (value is string) 
       return Enum.Parse(type, value as string); 
      else 
       return Enum.ToObject(type, value); 
     } 
     if (!type.IsInterface && type.IsGenericType) 
     { 
      Type innerType = type.GetGenericArguments()[0]; 
      object innerValue = ChangeType(value, innerType); 
      return Activator.CreateInstance(type, new object[] { innerValue }); 
     } 
     if (value is string && type == typeof(Guid)) return new Guid(value as string); 
     if (value is string && type == typeof(Version)) return new Version(value as string); 
     if (!(value is IConvertible)) return value; 
     return Convert.ChangeType(value, type); 
    }