Bạn có thể viết một phương pháp đệ quy sẽ chạy xuống biểu đồ đối tượng bằng cách sử dụng phản chiếu để tiếp tục đối tượng ... Đặt lại có thể khó khăn hơn nhiều. Ai biết được liệu có bất kỳ đối tượng nào trong số đó đang giữ tham chiếu đến tài nguyên không được quản lý hay hệ thống không. Nếu tôi đã làm bất cứ điều gì hạt này, tôi sẽ đi cho các phương pháp .GetFields(...)
trên loại.
ý tưởng khác ...
Nếu bạn chỉ làm điều này để tăng tốc độ phát triển tại sao không quấn clases của họ với các lớp học chuyển đổi của riêng bạn. Điều này sẽ cho phép bạn thay thế các thư viện của bên thứ ba bằng các lớp mô hình đơn giản của riêng bạn và cho phép cơ hội thay thế và sử dụng lại sau này tốt hơn.
Bệnh vì nó là ... Điều này dễ dàng hơn sau đó tôi nghĩ là như vậy. (Trong khi làm việc này ... xin vui lòng xem xét gói các lớp bên thứ ba.)
public static class Tools
{
public static XElement AsXml(this object input)
{
return input.AsXml(string.Empty);
}
public static XElement AsXml(this object input, string name)
{
if (string.IsNullOrEmpty(name))
name = input.GetType().Name;
var xname = XmlConvert.EncodeName(name);
if (input == null)
return new XElement(xname);
if (input is string || input is int || input is float /* others */)
return new XElement(xname, input);
var type = input.GetType();
var fields = type.GetFields(BindingFlags.Instance |
BindingFlags.NonPublic)
.Union(type.GetFields(BindingFlags.Instance |
BindingFlags.Public));
var elems = fields.Select(f => f.GetValue(input)
.AsXml(f.Name));
return new XElement(xname, elems);
}
public static void ToObject(this XElement input, object result)
{
if (input == null || result == null)
throw new ArgumentNullException();
var type = result.GetType();
var fields = type.GetFields(BindingFlags.Instance |
BindingFlags.NonPublic)
.Union(type.GetFields(BindingFlags.Instance |
BindingFlags.Public));
var values = from elm in input.Elements()
let name = XmlConvert.DecodeName(elm.Name.LocalName)
join field in fields on name equals field.Name
let backType = field.FieldType
let val = elm.Value
let parsed = backType.AsValue(val, elm)
select new
{
field,
parsed
};
foreach (var item in values)
item.field.SetValue(result, item.parsed);
}
public static object AsValue(this Type backType,
string val,
XElement elm)
{
if (backType == typeof(string))
return (object)val;
if (backType == typeof(int))
return (object)int.Parse(val);
if (backType == typeof(float))
return (float)int.Parse(val);
object ret = FormatterServices.GetUninitializedObject(backType);
elm.ToObject(ret);
return ret;
}
}
public class Program
{
public static void Main(string[] args)
{
var obj = new { Matt = "hi", Other = new { ID = 1 } };
var other = new { Matt = "zzz", Other = new { ID = 5 } };
var ret = obj.AsXml();
ret.ToObject(other);
Console.WriteLine(obj); //{ Matt = hi, Other = { ID = 1 } }
Console.WriteLine(other); //{ Matt = hi, Other = { ID = 1 } }
}
}
Nguồn
2010-04-07 20:33:54
nổi tiếng những lời cuối cùng ... 'Mã sẽ không bao giờ chạy trong một environment' sản xuất: OP –
@Matthew: Yeah, right :-) +1 – driis
Heh, tôi biết :) Nó chỉ để tăng tốc độ thời gian ấm lên trong dev, do đó, nó không có ý nghĩa nhiều bất cứ nơi nào khác. – lasseeskildsen