使用partial类添加私有属性?

时间:2009-12-11 23:04:46

标签: c# partial-classes

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

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

namespace CompanyName
{
  public partial class User
  {
    public Id { get; }
    public Name { get; set; }
  }
}

并且私有DLL将具有:

namespace CompanyName
{
  public partial class User
  {
    public Id { set; }
  }
}

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

5 个答案:

答案 0 :(得分:9)

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

您可以将您的课程定义为:

namespace CompanyName
{
    public class User
    {
        public Id {get;internal set;}
        public Name {get;set;}
    }
}

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


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

答案 1 :(得分:5)

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

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

public int Id { get; internal set; }

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

答案 2 :(得分:2)

我怀疑这会起作用。我想会将部分类一起编译到同一个程序集中,而不是由CLR处理。您可能希望看到internal关键字。

也许做这样的事情

abstract internal class UserPrototype
{
    protected Property....
}


sealed class User : UserPrototype
{
    public ...
}

答案 3 :(得分:0)

即使您可以执行此操作,您的私有属性和字段仍可通过反射发现。来自MSDN page for GetProperty

  

以下BindingFlags过滤器标志可用于定义要在搜索中包含的属性:

     

您必须指定 BindingFlags.Instance BindingFlags.Static 才能获得回复。

     

指定 BindingFlags.Public 以在搜索中包含公共属性。

     

指定 BindingFlags.NonPublic 以在搜索中包含非公共属性(即私有属性和受保护属性)。

答案 4 :(得分:0)

设计API的诀窍在于考虑接口类别(在本例中为抽象类)。请看一下这段代码:

public abstract class User
{
    protected String _name;
}

public sealed class PublicUser : User
{
    public String Name
    {
        get{ return this._name; }
    }
}

public class PrivateUser : User
{
    public String Name
    {
        get { return this._name; }
        set { this._name = value; }
    }
}

显然你可以使用任何类/命名空间名称,这只是为了清楚地说明。所有课程 - 如您所见 - 公开,所以现在由您决定哪个DLL可供您的客户使用。