EDIT: вы обновили свой вопрос, вы хотите построить класс без конструктора. Или вызовите по умолчанию «Пустое конструктор».
Этого не может быть сделано, поскольку компилятор не будет генерировать конструктор по умолчанию, если он уже указан. Тем не менее, в интересах читателей, вот как получить на внутреннем, защищенный или частный конструктор:
Предполагая, что ваш класс называется Foo:
using System.Reflection;
// If the constructor takes arguments, otherwise pass these as null
Type[] pTypes = new Type[1];
pTypes[0] = typeof(object);
object[] argList = new object[1];
argList[0] = constructorArgs;
ConstructorInfo c = typeof(Foo).GetConstructor
(BindingFlags.NonPublic |
BindingFlags.Instance,
null,
pTypes,
null);
Foo foo =
(Foo) c.Invoke(BindingFlags.NonPublic,
null,
argList,
Application.CurrentCulture);
Уродливый, но работает.
Конечно, может быть совершенно законная причина пометки конструктора как внутреннего, поэтому вы должны действительно учитывать логистику того, что хотите, прежде чем злоупотреблять этим классом, пройдя по нему с отражением.
Связанная с этим заметка и некоторые люди, как правило, не осознают заключается в том, что если вы создадите исключение во время построения, ваш объект все еще существует. Если он имеет финализатор, который все равно будет работать, вам нужно быть осторожным, чтобы не делать никаких предположений о том, что произошло в конструкторе. – meandmycode 2009-04-19 10:13:01
Зачем вам это нужно? Если это просто любопытство, все в порядке. – nawfal 2014-01-02 13:07:11
@nawfal WCF использует это для своего механизма сериализации, что является одной из причин его полезности в целом. Мой конкретный случай на самом деле играл вокруг существующей объектной модели (SharePoint OM), чтобы увидеть, можно ли обойти некоторые ошибки/ограничения для экспериментальных целей. Очень хриплый, но, опять же, экспериментальный. – 2014-01-09 01:36:27