代码之家  ›  专栏  ›  技术社区  ›  Rob

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

  •  0
  • Rob  · 技术社区  · 15 年前

    我正在创建一个班级,以获得选举结果。我有一个results类,它有一个静态方法,该方法将解析一个文件并返回一个results类,其中包含文件中的结果。

    我想确保只有静态方法可以修改结果,所以我一直在使用内部修饰符(precinct.internalcandients)(该修饰符阻止我的类在dll之外的实例访问这些方法,对吗?).

    无论如何,我需要将候选对象公开为类的实例化版本的只读列表,但显然我需要能够在填充过程中添加候选对象。所以,我在precinct类中创建了另一个参数precinct.candients,它公开了一个只读版本的internalcandients

    以下是我的设想:

    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 回复  |  直到 13 年前
        1
  •  2
  •   Eric J.    15 年前

    恐怕我有点坏消息,罗布…使用反射,可以完全避开访问修饰符。它们有助于保护团队不受其影响,但不适合提供安全性。

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

    更新:

    我坚持自己改正。您可以设置一个属性来防止反射,除非调用方具有完全信任(从leppie更新)。 See how .

    您可以阻止没有完全信任的调用方访问您的私有/内部方法和字段,但不能阻止完全信任的调用方使用反射。

        2
  •  0
  •   Rob    13 年前

    再一次。清理我以前的问题…最后我把自己的收藏卷了起来。

    做得很好……