Оказывается, ответ был прямо передо мной.
Если у вас есть класс, определенный следующим образом:
public class MyClass
{
private MyClass(){}
}
Вы можете создать его, используя следующий код, который я упомянул в моем вопросе:
(T)Activator.CreateInstance(typeof(T), true)
Дополнительный параметр true создает экземпляр, используя конструктор по умолчанию типа .
Получается, мне даже не нужно было использовать FormatterServices.GetUninitializedObject.
Тем не менее, я хотел бы поблагодарить Джона Скита за его ответ, потому что это помогло мне подвергнуть сомнению мой дизайн и углубиться в Activator.CreateInstance и немного улучшить мое понимание создания экземпляров класса.
На данный момент мое решение состоит в том, чтобы исключить использование FormatterServices и просто создать исключение, если что-то пойдет не так при создании типа.
В настоящее время, насколько я могу судить, используя (T) Activator.CreateInstance (typeof (T), true), я должен иметь возможность создавать большинство классов, с которыми я сталкивался, за исключением следующего:
public MyClass()
{
int a;
private MyClass(int a)
{
this.a = a;
}
}
Однако оказывается, что предлагает здесь способ создания экземпляра этого класса:
int argA = 100;
Type type = typeof(MyClass);
ConstructorInfo c = type.GetConstructor(BindingFlags.NonPublic
| BindingFlags.Instance, null, new Type[] { typeof(int) }, null);
MyClass o = (MyClass)c.Invoke(new Object[] { argA });
Но, подумав о том, что сказал Джон, я не думаю, что это будет полезно для тех, кто использует построитель тестовых данных, который я улучшаю. Если кто-то приложил много усилий, чтобы предотвратить создание экземпляра класса, то, возможно, он не сможет быть создан иначе, как с помощью средств, предоставленных разработчиком класса.