我有一个用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#语言也相当新,所以如果我的格式化/缺乏理解是不可救药的,我会道歉。