公开可在内部修改的只读属性

时间:2009-10-29 20:10:23

标签: c# .net design-patterns

我正在创建一个能够容纳选举结果的课程。我有一个结果类,它有一个静态方法,它将解析一个文件并返回一个带有文件结果的结果类。

我想确保只有静态方法可以修改结果,所以我一直在使用内部修饰符(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>();
  }
}

有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:2)

我担心我有一些坏消息Rob ...使用Reflection,可以完全绕过访问修饰符。它们有助于保护团队自身,但不适合提供安全性。

您需要确保代码的物理安全性,并确保没有人可以将您的DLL加载到他们自己创建的应用程序域中。

更新:

我自己纠正了。您可以设置一个防止反射的属性,除非CALLER有完全信任(来自Leppie的更新)。 See how

您可以阻止没有完全信任的呼叫者访问您的私人/内部方法和字段,但无法阻止完全信任呼叫者使用反射。

答案 1 :(得分:0)

再次。清理我的旧问题......我最后只是推出自己的收藏品。

精彩地工作......

相关问题