Tôi đang cố gắng tạo một quy trình đệ quy sẽ truy lục PropertyInfos cho tất cả các thành viên theo một đối tượng được chỉ định (trong .NET 3.5). Tất cả mọi thứ cho các thành viên ngay lập tức đang làm việc, nhưng nó cũng cần phải phân tích các lớp lồng nhau (và các lớp lồng nhau của chúng, vv).Thường quy đệ quy để lấy PropertyInfo
Tôi không hiểu cách xử lý phần phân tích các lớp lồng nhau. Làm thế nào bạn sẽ viết phần này của mã?
public class ObjectWalkerEntity
{
public object Value { get; set; }
public PropertyInfo PropertyInfo { get; set; }
}
public static class ObjectWalker
{
// This will be the returned object
static List<ObjectWalkerEntity> objectList = new List<ObjectWalkerEntity>();
public static List<ObjectWalkerEntity> Walk(object o)
{
objectList.Clear();
processObject(o);
return objectList;
}
private static void processObject(object o)
{
if (o == null)
{
return;
}
Type t = o.GetType();
foreach (PropertyInfo pi in t.GetProperties())
{
if (isGeneric(pi.PropertyType))
{
// Add generic object
ObjectWalkerEntity obj = new ObjectWalkerEntity();
obj.PropertyInfo = pi;
obj.Value = pi.GetValue(o, null);
objectList.Add(obj);
}
else
{
////// TODO: Find a way to parse the members of the subclass...
// Parse each member of the non-generic object
foreach (Object item in pi.PropertyType)
{
processObject(item);
}
}
}
return;
}
private static bool isGeneric(Type type)
{
return
Extensions.IsSubclassOfRawGeneric(type, typeof(bool)) ||
Extensions.IsSubclassOfRawGeneric(type, typeof(string)) ||
Extensions.IsSubclassOfRawGeneric(type, typeof(int)) ||
Extensions.IsSubclassOfRawGeneric(type, typeof(UInt16)) ||
Extensions.IsSubclassOfRawGeneric(type, typeof(UInt32)) ||
Extensions.IsSubclassOfRawGeneric(type, typeof(UInt64)) ||
Extensions.IsSubclassOfRawGeneric(type, typeof(DateTime));
}
Edit: Tôi đã sử dụng một số gợi ý Harlam, và đã đưa ra một giải pháp làm việc. Điều này xử lý cả hai lớp lồng nhau và danh sách.
tôi đã thay thế vòng lặp trước đây của tôi qua PropertyInfo như sau
foreach (PropertyInfo pi in t.GetProperties())
{
if (isGeneric(pi.PropertyType))
{
// Add generic object
ObjectWalkerEntity obj = new ObjectWalkerEntity();
obj.PropertyInfo = pi;
obj.Value = pi.GetValue(o, null);
objectList.Add(obj);
}
else if (isList(pi.PropertyType))
{
// Parse the list
var list = (IList)pi.GetValue(o, null);
foreach (object item in list)
{
processObject(item);
}
}
else
{
// Parse each member of the non-generic object
object value = pi.GetValue(o, null);
processObject(value);
}
}
Tôi cũng đã thêm một tấm séc mới để xem nếu một cái gì đó là một danh sách.
private static bool isList(Type type)
{
return
IsSubclassOfRawGeneric(type, typeof(List<>));
}
Cảm ơn sự trợ giúp!
Có thể sử dụng lợi tức lợi nhuận và cũng nên giữ một danh sách các đối tượng đã được xử lý cho thuộc tính tham chiếu trở lại. – riezebosch
Điều này gần như hoạt động, nhưng nó đang gặp phải sự cố với danh sách. – Rethic