Tôi đã phải thực hiện chuyển đổi ngược lại ngược lại (chuỗi để nhập) như là một phần của bộ nối tiếp mà tôi muốn viết (tránh tích hợp trong một, vì lý do). Tôi đã làm deserialize và đây là bài duy nhất để nói về nó, vì vậy tôi đang cập nhật với câu trả lời của tôi trong khi nó vẫn còn tươi.
Phương pháp tôi đã sử dụng là sử dụng sự phản chiếu để tìm hiểu cơ bản những gì tôi cần làm. Loại biến trong ví dụ sau là đối tượng Type của loại tôi đang chuyển đổi sang, E là một XmlNode có nội dung tôi sẽ chuyển đổi và newVar là một thể hiện của một kiểu mẫu T mà tôi sẽ quay trở lại. đoạn này không chịu bất kỳ hạn chế về T (đó là lý do tại sao không có chuỗi trực tiếp assign/diễn viên) và giả định đối tượng/enums được xử lý khác nhau (các đối tượng và đếm phá vỡ này):
MethodInfo convertMethod;
if(Type.GetTypeCode(type) != TypeCode.String)
convertMethod = typeof(XmlConvert).GetMethod ("To" + type.Name);
else
convertMethod = E.InnerText.GetType().GetMethod("Clone");
if(convertMethod == null)
{
//Error
}
else
{
if(Type.GetTypeCode (type)!= TypeCode.String)
newVar = (T)convertMethod.Invoke(null, new object[] { E.InnerText });
else
newVar = (T)convertMethod.Invoke (E.InnerText, new object[]{});
}
(Chuỗi cần phải được xử lý như một trường hợp đặc biệt như ToString() làm một cái gì đó hoàn toàn khác và phá vỡ tất cả mọi thứ).
Một cách khác xung quanh (theo các bài bản gốc) sẽ là một cái gì đó tương tự (không dự thi, sẽ cập nhật nếu tôi viết hàm serialize):
MethodInfo convertMethod;
if(Type.GetTypeCode(type) != TypeCode.String)
convertMethod = typeof(XmlConvert).GetMethod ("ToString", new Type[] {typeof(T)});
else
convertMethod = typeof(string).GetMethod("Clone");
if(convertMethod == null)
{
//Error
}
else
{
string str;
if(Type.GetTypeCode (type)!= TypeCode.String)
str = (string)convertMethod.Invoke(null, new object[] { Value });
else
str = (string)convertMethod.Invoke (Value, new object[]{});
}
Trong trường hợp này, chuyển đổi từ T đến chuỗi và Giá trị chứa một loại T mà chúng tôi đang chuyển đổi. Sự khác biệt là chúng ta yêu cầu ToString nhưng chỉ định hàm với một tham số kiểu T. Điều này phải là duy nhất đủ.
Tôi đánh giá cao những người đứng đầu, nhưng tôi đã trải qua XmlSerializer, DataContractSerializer địa ngục. Tôi thậm chí còn chơi với XamlWriter. Giá trị của tôi được đóng hộp bởi vì tôi đang truy cập chúng thông qua một Giao diện có giao dịch với nhiều kiểu dữ liệu. –