我正在创建一个能够容纳选举结果的课程。我有一个结果类,它有一个静态方法,它将解析一个文件并返回一个带有文件结果的结果类。
我想确保只有静态方法可以修改结果,所以我一直在使用内部修饰符(Precinct.InternalCandidates)(防止我的类在dll之外的实例访问方法,对吗? )。
无论如何,我需要将候选人作为只读列表公开给我班级的实例化版本,但我显然需要能够在人口过程中添加候选人。所以,我在Precinct类中创建了另一个名为Precinct.Candidates的参数,它公开了一个只读版本的InternalCandidates
以下是我设想它的工作原理:
Results r = Results.ParseResultsFile("PathToFile.txt");
r.Candidates.Add(new Candidate) // Should error here
Console.WriteLine(r.Candidates[0].Name) // Should work
这是我对班级存根的看法:
public class Results {
private List<Precinct> precincts = new List<Precinct>();
public ReadOnlyCollection<Precinct> Precincts {
get { return this.precincts.AsReadOnly(); }
}
public Results() {}
public static Results ParseResultsFile(string filePath) { ... }
}
public class Precinct {
internal List<Contest> InternalContests { get; set; }
public ReadOnlyCollection<Contest> Contests {
get { return this.InternalContests.AsReadOnly(); }
}
public Precinct {
this.InternalContests = new List<Contest>();
}
}
有没有更好的方法来实现这一目标?
答案 0 :(得分:2)
我担心我有一些坏消息Rob ...使用Reflection,可以完全绕过访问修饰符。它们有助于保护团队自身,但不适合提供安全性。
您需要确保代码的物理安全性,并确保没有人可以将您的DLL加载到他们自己创建的应用程序域中。
更新:
我自己纠正了。您可以设置一个防止反射的属性,除非CALLER有完全信任(来自Leppie的更新)。 See how
您可以阻止没有完全信任的呼叫者访问您的私人/内部方法和字段,但无法阻止完全信任呼叫者使用反射。
答案 1 :(得分:0)
再次。清理我的旧问题......我最后只是推出自己的收藏品。
精彩地工作......