使用partial类添加私有属性?

Ada*_*m V 0 c# partial-classes

我有一个我定义的公共类,它最终将成为API的一部分,因此它必须具有某些公共属性.但是,我还希望某些属性是只读的,除非它们是在我自己的项目中创建的(例如,如果用户有我们的API,他们可以创建一个User对象,但是他们无法写入其ID字段,仅当我们从数据库中提取时才会填写).

我的想法是使用相同的命名空间,即"公共"DLL和"私有"DLL,有两个独立的程序集.公共DLL中的原型将如下所示:

namespace CompanyName
{
  public partial class User
  {
    public Id { get; }
    public Name { get; set; }
  }
}
Run Code Online (Sandbox Code Playgroud)

并且私有DLL将具有:

namespace CompanyName
{
  public partial class User
  {
    public Id { set; }
  }
}
Run Code Online (Sandbox Code Playgroud)

这会有用吗?如果没有,有什么更好的方法呢?

adr*_*nks 9

部分类不能跨越程序集,因此这不起作用.

您可以将您的类定义为:

namespace CompanyName
{
    public class User
    {
        public Id {get;internal set;}
        public Name {get;set;}
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着只有具有内部访问权限的代码才能设置Id属性值.如果需要从程序集外部进行设置,请确保程序集具有强名称,然后可以使用InternalsVisibleTo属性将程序集的内部访问权限授予另一个程序集(设置值的程序集Id).


我最近不得不为我正在使用的API做一些非常类似的事情.我们的API主要是使用接口来定义的,所以我能够通过公共部分的Public API项目和构成我们内部代码使用的API的内部API项目来实现这一点,内部接口来自公共部分. .API接口的实现实现了两个接口,这意味着我们的内部代码可以访问非公共API的部分.


ito*_*son 5

不,这不行.部分类在编译时合并:您​​不能将成员添加到已编译的类.

根据您的代码的确切排列方式,更好的方法是提供内部setter:

public int Id { get; internal set; }
Run Code Online (Sandbox Code Playgroud)

如果您需要能够从另一个程序集执行该集合,但只能控制一个程序集,则可以使用InternalsVisibleToAttribute将该程序集访问权限授予内部setter.