Casting通过getter方法公开私有数据

时间:2015-09-18 05:16:54

标签: c# casting

我有一个用c#构建的依赖图类,它有几个私有数据属性,只能被访问,但更重要的是通过标准的getter / setter'方法。我遇到了一个测试,通过将IEnumerable作为ICollection进行投射来公开公共接口。我不确定如何防止这种明显不必要的行为。

这是失败的单元测试,确认我正在公开私人数据:

for (int i = 0; i < a1.length; i++) {
    mergedArray[i + a1.length] = a2[i];
}    

这是我的方法&#39; GetDependents&#39;同时调用ICollection演员。

[TestMethod]
    public void PrivateDataTest()
    {
        try
        {
            DependencyGraph dg = new DependencyGraph();
            dg.AddDependency("a", "b");
            dg.AddDependency("a", "c");
            ICollection<string> temp = (ICollection<string>)dg.GetDependents("a");
            temp.Add("d");
            Assert.IsTrue(new HashSet<string> { "b", "c", "d" }.SetEquals(temp));
            Assert.IsTrue(new HashSet<string> { "b", "c" }.SetEquals(dg.GetDependents("a")));
        }
        catch (Exception e)
        {
            if (!(e is NotSupportedException || e is InvalidCastException))
                Assert.Fail();
        }
    }

此外,这是&#39;数据&#39;正在访问的财产:

/// <summary>
/// Enumerates dependents(s).
/// </summary>
public IEnumerable<string> GetDependents(string s)
    {
        try
        {
            return this.data[s].getDependencies();
        }
        catch (Exception e)
        {
            return new List<string>();
        }
    }

&#39;数据&#39; property包含一个字符串,表示节点的名称,例如&#34; a&#34;和自定义Node对象。该名称是实际Node对象的键,它是一个嵌套类,用于存储节点的名称和依赖项/依赖项列表。这是我的Node类(注意。为了这个问题,我删除了很多无关紧要的方法):

    // key = node name, value = node object and all node data e.g. dependencies, dependees, name
    private SortedDictionary<String, Node> data;

我希望这足以让某人了解我的问题范围,因为它与我的图表有关。我会重申一下;怎么会通过铸造防止这种界面的破坏?这是我在StackOverflow上的第一个问题,而且我对C#语言也相当新,所以如果我的格式化/缺乏理解是不可救药的,我会道歉。

0 个答案:

没有答案