向属性的属性添加功能

时间:2011-10-24 18:37:23

标签: c#

我有一个名为Graph的对象。

我有Graph类中的顶点列表。所以Class有点像这样。它是一个.Net 2.0代码。

public class Graph
{
    public List<Vertex> Vertices 
    {
        get{ return _vertices}
    }
} private List<Vertex> _vertices;

这是我的问题。在将其添加到Graph对象之前,我想验证Vertex对象(通过调用Vertex.IsValid()方法)。

最好的方法是什么?我喜欢在属性的getter块中添加代码的方式。有没有类似的方法呢?

我有解决方法,但我希望以最好的方式做到这一点。

3 个答案:

答案 0 :(得分:2)

最佳解决方案是不将顶点列表公开为可变列表。相反,如果您需要Vertices属性,请使其返回只读数据结构。然后,只需添加Add()方法,并验证您想要的所有内容:

public ReadOnlyCollection<Vertex> Vertices
{
    get { return _vertices.AsReadOnly(); }
}

public void Add(Vertex vertex)
{
    if (vertex.IsValid())
        _vertices.Add(vertex);
}

答案 1 :(得分:2)

我对类似情况的解决方案是添加一个辅助方法来将Vertex对象添加到Graph中,如下所示:

public void AddVertex(Vertex vertex)
{
    if (vertex.IsValid())
        _vertices.Add(vertex);
}

如果你没有大量的Graph对象,而Graphs通常有Vertexs,我会预先分配List集合,所以它总是空的而且从不为null(我认为在这个特殊的情况下这可能是一个好主意)。否则,您的AddVertex方法必须检查_vertices是否为null并分配List。在这种情况下,我通常会创建一个CreateVertices()方法,如果它是null,则分配List,这样它也可以在必要时在类的其他方法中使用,甚至可以由类的用户使用。简单的方法是始终预先分配集合,但我个人避免,如果有大量的类实例,集合通常可以不使用。

当然,这个解决方案并不完美,因为List不是不可变的 - 类的用户可以使用Vertices属性来获取列表,并直接对其执行Add()。我唯一的解决方案是文档 - 例如Vertices属性上的备注标记,它解释了添加到它的正确方法。 C#可以从将标记返回的集合标记为只读的方式中受益。如果您迫切希望这样做,您可以包装List并创建一个只读集合,该集合可以从普通List复制构造自身,然后返回带有该属性的不可变列表。

答案 2 :(得分:1)

可以尝试这样的事情,伪代码

修改

扩展方法

    public static class MyCoolVertex
    {
        public static void AddVertexAndValidate(this List<int> list, Vertex value)
        {
            if(value.IsValid())
                list.Add(value);
        }
    }

此后使用AddVertexAndValidate方法。

:基本上你已经完成了

错误:您无法阻止某人仅在列表中拨打Add,这会违反您的工作流程。

希望这会有所帮助..