Không có ví dụ nào tôi tìm thấy đã làm việc cho tôi, tôi đã trộn lẫn mã bên dưới và có vẻ như nó hoạt động. Tôi có một hệ thống phân cấp được tạo bởi deserializing một tệp XML và tôi có thể lặp qua tất cả các đối tượng trong hệ thống phân cấp, nhưng bạn có thể điều chỉnh điều này để chỉ lặp qua một ObservableCollection và lấy các đối tượng như đối tượng và không gõ mạnh.
Tôi muốn thêm PropertyChangingEventHandler vào mọi thuộc tính trong cấu trúc phân cấp để tôi có thể triển khai chức năng hoàn tác/làm lại.
public static class TraversalHelper
{
public static void TraverseAndExecute(object node)
{
TraverseAndExecute(node, 0);
}
public static void TraverseAndExecute(object node, int level)
{
foreach (var property in node.GetType().GetProperties())
{
var propertyValue = node.GetType().GetProperty(property.Name).GetGetMethod().Invoke(node, null); // Get the value of the property
if (null != propertyValue)
{
Console.WriteLine("Level=" + level + " : " + property.Name + " :: " + propertyValue.GetType().Name); // For debugging
if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(ObservableCollection<>)) // Check if we are dealing with an observable collection
{
//var dummyvar = propertyValue.GetType().GetMethods(); // This was just used to see which methods I could find on the Collection
Int32 propertyValueCount = (Int32)propertyValue.GetType().GetMethod("get_Count").Invoke(propertyValue, null); // How many objects in the collection
level++;
for (int i = 0; i < propertyValueCount; i++) // Loop over all objects in the Collection
{
object properyValueObject = (object)propertyValue.GetType().GetMethod("get_Item").Invoke(propertyValue, new object[] { i }); // Get the specified object out of the Collection
TraverseAndExecute(properyValueObject, level); // Recursive call in case this object is a Collection too
}
}
}
}
}
}
Phương pháp này chỉ được gọi như thế này
TraversalHelper.TraverseAndExecute(object);
Nếu bạn chỉ muốn tạo ra một bộ sưu tập của các đối tượng bạn chỉ cần chút mã này
ObservableCollection<Field> typedField = migration.FileDescriptions[0].Inbound[0].Tables[0].Table[0].Fields[0].Field; // This is the strongly typed decalaration, a collection of Field objects
object myObject = typedField; // Declare as object
Int32 propertyValueCount = (Int32)myObject.GetType().GetMethod("get_Count").Invoke(myObject, null); // How many objects in this Collection
for (int i = 0; i < propertyValueCount; i++) // Loop over all objects in the Collection
{
object properyValueObject = (object)myObject.GetType().GetMethod("get_Item").Invoke(myObject, new object[] { i }); // Get the specified object out of the Collection, in this case a Field object
// Add the object to a collection of objects, or whatever you want to do with object
}
Nguồn
2017-07-13 09:37:43
đó được gọi là hiệp phương sai, và nó chưa có sẵn trong C# –
(và cho các bộ sưu tập, sẽ không có sẵn trong 4.0 hoặc - chỉ để được rõ ràng) –