2008-12-26 38 views
31

Tôi có đoạn mã sau:chức năng chuyển đổi Generic dường như không làm việc với Guids

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

    result = ParameterRepository.FetchParameter(parameterKey); 

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

Loại result.CurrentValue là chuỗi. Tôi muốn có thể chuyển đổi nó thành Guid nhưng tôi vẫn gặp lỗi:

Invalid cast from System.String to System.Guid

Điều này hoạt động hoàn hảo với các kiểu dữ liệu nguyên thủy.
Có cách nào để thực hiện công việc này cho các loại dữ liệu không nguyên thủy không?

Trả lời

82

Làm thế nào về:

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

trình tốt cho Guid và hầu hết các loại khác.

+4

Hãy cẩn thận với việc sử dụng ConvertFromInvariantString. Nếu loại của bạn là một DateTime và bạn có định dạng ngày quốc tế, điều này sẽ thổi lên. Tôi chỉ theo dõi một lỗi thực sự khó tìm thấy dựa trên câu trả lời này. –

+0

@ DPeden thực sự, họ phải phù hợp - sử dụng của tôi ở đây đã sử dụng bất biến trên giả định rằng dữ liệu tuần tự thường phải ở định dạng bất biến –

+0

Yep, đồng ý. Tôi vẫn upvoted câu trả lời của bạn vì nó là rất hữu ích. Chỉ cần chỉ ra này gotcha tiềm năng cho những người khác vì nó đốt cháy tôi. –

0

Hãy thử này:

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); 
    } 
Các vấn đề liên quan