2008-12-26 16 views
31

Mam następujący kod:Generic funkcja konwersji nie wydają się działać z GUID

public static T ParameterFetchValue<T>(string parameterKey) 
{ 
    Parameter result = null; 

    result = ParameterRepository.FetchParameter(parameterKey); 

    return (T)Convert.ChangeType(result.CurrentValue, typeof(T), CultureInfo.InvariantCulture); 
} 

Rodzaj result.CurrentValue jest ciąg. Chciałbym móc przekonwertować go na Guid, ale nadal otrzymuję błąd:

Invalid cast from System.String to System.Guid

Działa to doskonale z pierwotnymi typami danych.
Czy jest jakiś sposób, aby uzyskać dla niepoptymalnych typów danych?

Odpowiedz

82

Jak o:

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

działa poprawnie Guid i większości innych typów.

+4

Bądź ostrożny z używaniem ConvertFromInvariantString. Jeśli Twój typ to DateTime i masz międzynarodowe formaty daty, to się wysadzi. Właśnie znalazłem naprawdę trudny do znalezienia błąd oparty na tej odpowiedzi. –

+0

@DPeden rzeczywiście, muszą się zgadzać - moje użycie tutaj było używane niezmiennie przy założeniu, że zserializowane dane powinny być zwykle w niezmiennym formacie –

+0

Tak, zgodzili się. Nadal przegłosowałem twoją odpowiedź, ponieważ jest ona bardzo przydatna. Po prostu wskazuję na to potencjalne zagrożenie dla innych, ponieważ mnie spalił. –

0

Spróbuj to:

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); 
    } 
Powiązane problemy