2011-12-22 27 views
5

Tôi đang cố chuyển đổi một chuỗi thành lớp tương ứng của nó (ví dụ: "true" thành true). Và tôi nhận được "TypeConverter không thể chuyển đổi từ System.String". Giá trị được chuyển là "true".TypeConverter không thể chuyển đổi từ System.String

Tôi có gọi phương thức không chính xác không?

public static T ToClass<T>(this IDictionary<string, string> source) where T : class, new() 
{ 
    Type type = typeof(T); 
    T ret = new T(); 

    foreach (var keyValue in source) 
    { 
     type.GetProperty(keyValue.Key).SetValue(ret, keyValue.Value.ToString().TestParse<T>(), null); 
} 

    return ret; 
} 

public static T TestParse<T>(this string value) 
{ 
    return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(value); 
} 
+0

có thể trùng lặp: http://stackoverflow.com/questions/8625/generic-type-conversion-from-string – Adam

Trả lời

6

Vấn đề là các T bạn vượt qua với phương pháp TestParse không phải là loại bool nhưng loại của lớp bạn muốn tạo. Nếu bạn thay đổi dòng thành

public static bool TestParse(this string value) 
    { 
     return (bool)TypeDescriptor.GetConverter(typeof(bool)).ConvertFromString(value); 
    } 

Nó hoạt động cho trường hợp bool nhưng rõ ràng không phải cho các trường hợp khác. Bạn cần lấy loại thuộc tính bạn muốn đặt qua phản chiếu và chuyển nó sang phương thức TestParse.

public static T ToClass<T>(this IDictionary<string, string> source) where T : class, new() 
{ 
    Type type = typeof(T); 
    T ret = new T(); 

    foreach (var keyValue in source) 
    { 
     var propertyInfo = type.GetProperty(keyValue.Key); 
     propertyInfo.SetValue(ret, keyValue.Value.ToString().TestParse(propertyInfo.PropertyType), null); 
    } 

    return ret; 
} 

public static object TestParse(this string value, Type type) 
{ 
    return TypeDescriptor.GetConverter(type).ConvertFromString(value); 
} 

tôi sẽ cũng thay đổi phương pháp TestParse từ một phương pháp mở rộng đến một phương pháp thông thường vì nó cảm thấy kinda lạ

+0

Tuyệt vời! :) Cảm ơn rất nhiều và xmas vui vẻ! :) –

+0

xmas vui vẻ cho bạn quá :) – kev

1

Làm điều đó như nó đã được thực hiện trong this answer:

return (T)Convert.ChangeType(value, typeof(T)); 

nơi T là Loại và giá trị mục tiêu là Loại string
CHỈNH SỬA: điều này chỉ hoạt động cho IConvertible người triển khai ...

Các vấn đề liên quan