搜索对象图

时间:2012-01-28 16:38:37

标签: .net reflection

我认为我能够做得更简单,而不是看起来像。

我需要以最有效的方式在对象图中获取特定类型的所有实例。

我已经开始使用反射来处理对象的属性,寻找这种类型的实例,然后继续关闭所有其他复杂的类型和集合。它开始感觉像很多工作,以及某人过去需要做的事情。所以在我承诺进行大量工作和测试之前,我想我会问我是否错过了框架内的快速获胜,或者是否有任何建议让图书馆做这种工作。

为什么我要这样做? 我有一个其他人来自的类型。此类型具有公共属性,更重要的是具有识别错误的特定属性HasErrors。此类型用于建模。每种型号都不同。有些简单而浅浅有些复杂而深沉。作为一般规则,每个复杂节点都是一个集合或从此类型派生的自定义类型。我需要一种快速遍历这些检查所有HasErrors属性的任何实例的方法。任何true实例都表示模型出错。

Model  
    CustomerId (int)  
    CustomerDetails : MyType  
        Name (string)  
        DoB (DateTime)  
        Addresses (Collection<Address : MyType>)  
            [Line1 (string)  
             Line2 (string)]  

希望这样说明。

2 个答案:

答案 0 :(得分:0)

如果你想遍历由你的类型组成的整个对象图,你可以让它们都实现这样的界面:

interface IComponent
{
    IEnumerable<IComponent> Components { get; }
}

然后使用此界面遍历整个对象图。如果图形可以包含循环,则必须使用HashSet<IComponent>访问顶点之类的东西来防范这种情况。

实现该接口时,迭代器块可能很有用:

class FamilyMember : IComponent
{
    IEnumerable<IComponent> IComponent.Components
    {
        get
        {
            if (Father != null)
                yield return Father;

            if (Mother != null)
                yield return Mother;

            foreach (var child in Children)
                yield return child;
        }
    }
}

如果您已经拥有许多属于对象图的类型,那么这样做可能会很乏味。如果是这种情况并且你不介意性能损失,那么使用反射可能对你更好。

答案 1 :(得分:0)

这是一种“开箱即用”的答案,但我不认为你应该搜索 down 树,我认为你应该传播错误 up 树。

为每个对象提供对其父对象的引用,或对模型的根节点。当一个对象的HasErrors属性变为true时,它会在树上向所有祖先发送一条消息,或者直接发送到根,这取决于你使用的是哪种引用。

通过这种方式,您可以在模型出现错误时立即知道,并且您不需要实现复杂,昂贵且可能无结果的自上而下的树搜索。