【问题标题】:Prevent calling Public constructors except for XML Serializer [duplicate]防止调用除 XML Serializer 之外的公共构造函数 [重复]
【发布时间】:2010-11-10 23:25:44
【问题描述】:

可能重复:
Why XML-Serializable class need a parameterless constructor

有谁知道是否可以防止从程序集范围之外调用公共构造函数?

我正在做的是提出一个具有 XML 可序列化类的类库。如果在不设置各种属性的情况下构造这些类,那么我想阻止这种状态。

我想知道是否有办法阻止任何人调用我的公共构造函数,并将其保留在那里仅用于序列化?

【问题讨论】:

  • 是否要求构造函数是公开的,还是可以将它们设为内部的?
  • 如果在基类中没有显式调用任何构造函数,则会隐式调用无参构造函数。没有办法解决它,如果不调用构造函数,您将无法实例化一个类。
  • 检查这个答案:http://stackoverflow.com/questions/267724/why-xml-serializable-class-need-a-parameterless-constructor。您可以创建内部或私有构造函数并仍然使用 XML 序列化。
  • 移除了无障碍标签,对这个问题无效。
  • 为什么要公开构造函数,而要防止调用它?

标签: c# xml-serialization


【解决方案1】:

通常,我会创建一个带有参数的公共构造函数,这将使对象有效,并创建一个具有有效默认值的公共无参数构造函数。

public foo() {
  this.bar = -1;
}

public foo(int bar) {
  this.bar = bar;
}

可以根据您的情况使用私有/内部构造函数,并且您可以创建一个工厂模式来处理外部代码的对象创建。

【讨论】:

  • +1 只是因为我同意通常应该初始化合理的值,但是在这种情况下,值是其他类,需要正确。
【解决方案2】:

要实现您的要求,您可能应该将构造函数设为私有,然后在正确的程序集调用 getInstance 时使用 getInstance 方法返回对象。如果您将调用该函数的对象或程序集作为其参数之一传递,则可以在 getInstance 方法内部进行检查。

【讨论】:

    【解决方案3】:

    我不知道它是否适用于您的情况,但您可以检查调用程序集:

    if (Assembly.GetCallingAssembly().GetName().Name == "Forbidden.Assembly")
    {
        throw new Exception(...);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 2016-08-04
      相关资源
      最近更新 更多