有选择地限制特定模块的属性访问

时间:2018-05-19 09:40:46

标签: c# properties encapsulation

我有一个使用Thing从JSON文件反序列化的类DataContractJsonSerializer

[DataContract]
class Thing
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Name { get; set; }

    // and so on...
}

要使此功能正常运行,所有属性都必须包含public或至少internal个设置者。

另外两个模块(程序集)需要访问此类:

  • ThingView应具有对大多数属性的只读权限。
  • ThingEditor需要完全访问所有属性。

我可以设置制定者internal,但ThingEditor无法获得完全访问权限。

要限制对ThingView类的访问,我能想到的最好的想法是创建Thing类的只读包装器。但这会涉及大量的代码重复。

在这种情况下,是否有更好的方法可以实现更多的封装?

(实际代码包含大约20个此类型的类,其中一些形成嵌套结构。另外,有两个以上的模块需要读取或完全访问属性。)

1 个答案:

答案 0 :(得分:1)

规范中没有开箱即用的功能。但是,你可以做这样的事情,例如

public interface IReadOnlInterface
{
   int Id { get; }
   string Name { get; }
}

public interface IInterface
{
      int Id { get; set; }
      string Name { get; set; }
}

internal class Thing : IInterface , IReadOnlInterface
{
   public int Id { get; set; }
   public string Name { get; set; }
}

但是没有什么可以阻止编码器将脏小的手指投射到另一个界面。如果它只是一个运行时问题,那么接口应该没问题。否则你将不得不用安全数据创建一个更好的api设计,以及具有只读访问权限的代理类型对象,尽管可能有人有更好的想法。