在C#中从类外部访问私有构造函数

And*_*nZA 25 c# constructor visibility default-constructor

如果我使用私有默认构造函数和具有参数的公共构造函数定义类,如何访问私有构造函数?

public class Bob
{
   public String Surname { get; set; }

   private Bob()
   { }

   public Bob(string surname)
   {
      Surname = surname;
   }
}
Run Code Online (Sandbox Code Playgroud)

我可以通过类上的静态方法访问私有构造函数,如下所示:

public static Bob GetBob()
{
   return new Bob();
}
Run Code Online (Sandbox Code Playgroud)

我认为我可以通过扩展方法访问私有构造函数,因为(根据我的理解)扩展方法被翻译,以便它们看起来是类上的静态方法,但我不能:

static class Fred
{
   public static Bob Bobby(this Bob bob)
   {
      return new Bob();
   }
}
Run Code Online (Sandbox Code Playgroud)

那么,我如何访问私有构造函数?

谢谢


编辑:

我想这样做的原因是我想为我们的某个业务类创建测试,但不允许此类的使用者能够错误地实例化对象.我正在测试它,所以我知道(我希望!)在什么情况下测试会失败.我现在还在测试n00b,所以我的想法可能是也可能不是做事的"错误方式".

我已经改变了我的测试策略,就像这个类的消费者那样做事,即调用公共方法,如果公共方法没问题,假设私有方法没问题.我仍倾向于测试私有方法,但我的老板呼吸了我的脖子上交付:-(

jga*_*fin 44

由于某种原因,默认构造函数是私有的.开发人员并不是为了娱乐而私密.

但是如果您仍然想使用默认构造函数,则可以使用反射来获取它.

Activator.CreateInstance(typeof(YourClass), true);
Run Code Online (Sandbox Code Playgroud)

编辑

我看到了你对测试的评论.切勿测试受保护的或私有的方法/属性.如果您无法通过公共API设法测试这些方法/属性,那么您可能做错了.删除它们或重构该类.

编辑2

忘了绑定旗帜.

  • 是的.这就是为什么我写了*默认构造函数是私有的有一个原因.开发人员不会为了娱乐而私密.* (7认同)
  • 谢谢。但是,`GetConstructor` 方法返回 null,因此代码会抛出 NullReferenceException。`typeof(Bob).GetConstructors(BindingFlags.NonPublic);` 返回一个空数组。 (2认同)
  • @Liviu M. - 是的,这显然是一个黑客,但这正是OP在他的问题中所要求的,所以这使得这是正确的答案;) (2认同)