2008-12-26 60 views
31

我有以下的代碼工作:通用轉換功能似乎不使用的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); 
} 

類型的result.CurrentValue是字符串。我希望能夠將它轉換爲Guid,但我不斷收到錯誤:

Invalid cast from System.String to System.Guid

這與原始數據類型完美配合。
有什麼辦法可以讓使這項工作適用於非原始數據類型

回答

82

如何:

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

工作正常Guid和大多數其他類型。

+4

小心使用ConvertFromInvariantString。如果您的類型是日期時間,並且您有國際日期格式,則會爆炸。我根據這個答案追蹤了一個非常難以發現的錯誤。 – 2013-04-27 21:42:39

0

試試這個:

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