C#库中的内部构造函数

C#库中的内部构造函数,c#,inheritance,C#,Inheritance,我正在用C#编写一个数据访问库,我的数据模型类的结构如下(在DataAccess程序集中): 如您所见,每个字段都有一个不同的构造函数 要使用它,您可以从XML文件自动生成类, 例如,包含“客户”数据类和“员工”数据类的“商店”数据模型将生成以下代码: public class StoreDataModel : DataModel { public CustomerDataClass Customer { get; private set;} public EmployeeDataC

我正在用C#编写一个数据访问库,我的数据模型类的结构如下(在DataAccess程序集中):

如您所见,每个字段都有一个不同的构造函数

要使用它,您可以从XML文件自动生成类, 例如,包含“客户”数据类和“员工”数据类的“商店”数据模型将生成以下代码:

public class StoreDataModel : DataModel
{
   public CustomerDataClass Customer { get; private set;}
   public EmployeeDataClass Employee { get; private set;}
   public StoreDataModel()
   {
     Customer = new CustomerDataClass(this);
     AddClass(customer)
     Employee = new EmployeeDataClass(this);
     AddClass(employee)
   }
}
public class CustomerDataClass : DataClass
{
   public StringField FirstNameField { get; private set; }
   public StringField LastNameField { get; private set; }
   public DateField BirthDateField { get; private set; }

   public CustomerDataClass(StoreDataModel model) : base(model)
   {
      FirstNameField = new StringField(this, "FirstName", true, null, 50);
      LastNameField = new StringField(this, "LastName", true, null, 50);
      ...
   }
}
public class EmployeeDataClass : DataClass {...}
我对这段代码的问题是,由于生成的代码与基本数据模型类位于不同的程序集中,因此StringField/IntegerField/。。。类必须具有公共构造函数,这意味着数据访问程序集之外的任何人都可以创建它们的实例,我希望防止这种情况发生

由于字段类有不同的构造函数,我想不出一种方法来使用反射或泛型在基本数据访问程序集中创建字段

我能想到的唯一方法是向每个字段类添加一个“Initialize”方法,该方法将包含特定字段的属性,并在自定义数据类构造函数中执行以下操作:

   public CustomerDataClass(StoreDataModel model) : base(model)
   {
      FirstNameField = AddField<StringField>(this, "FirstName", true, null)
                              .Initialize(50);
      LastNameField = AddField<StringField>(this, "LastName", true, null)
                              .Initialize(50);
      ...
   }
公共CustomerDataClass(StoreDataModel模型):基础(模型)
{
FirstNameField=AddField(这是“FirstName”,true,null)
.初始化(50);
LastNameField=AddField(此“LastName”,true,null)
.初始化(50);
...
}
这将允许我将字段构造函数更改为internal,并且不允许任何人创建字段实例。此解决方案的问题在于,它允许任何人运行“Initialize”方法并更改字段(这可以通过添加私有布尔成员(m_IsInitialized)来解决,该成员将在首次运行“Initialize”时设置为true,每次“Initialize”如果m_IsInitialized为true,它将抛出异常,但此解决方案有点难看)

有谁有更好的解决方案吗?

嗯,有三种选择:

  • 使用InternalsVisibleTo使构造函数可见
  • 在StringField等中编写静态方法以创建实例
  • 在DataModel或DataClass中写入受保护的方法以创建字段实例(以便CustomerDataClass可以调用DataClass.CreateStringField等)

但是,我不知道这些是否可以接受,因为我不清楚您为什么不希望字段类具有公共构造函数。

更不用说,如果您在构造函数之外进行初始化,您将失去类不变量保持不变的保证,因为您依赖于调用方的“帮助”具有对象结构。但我不是C#程序员,所以我真的帮不了你首先,我不想在字段类上放置公共构造函数的原因是,no将尝试创建一个新字段,并在代码的其余部分使用它(不太可能,但仍然…)-InternalsVisibleTo强制数据访问程序集了解自定义数据模型程序集…-静态方法将允许任何人创建字段-我想这一点,但每当我添加另一个字段类时,我将需要编辑DataClass类。。。这不是最干净的方式。“InternalsVisibleTo”对我没有帮助,因为数据访问程序集是一个公共库,将用于各种项目。要使用它,我必须修改每个新项目的数据访问程序集(添加另一个InternalsVisibleTo属性)。您仍然没有解释为什么不希望其他程序集创建实例。哦,我不希望任何用户创建field类的实例,然后尝试将其与其余代码一起使用(用户的字段类可能是一个不存在的字段,会弄乱系统)。我想确定除了我之外没有人可以创建字段
   public CustomerDataClass(StoreDataModel model) : base(model)
   {
      FirstNameField = AddField<StringField>(this, "FirstName", true, null)
                              .Initialize(50);
      LastNameField = AddField<StringField>(this, "LastName", true, null)
                              .Initialize(50);
      ...
   }