Создание WebControls из полного пути (имя сборки?)

У меня есть веб-страница в ASP.NET 3.5, которая будет динамически создавать WebControls. WebControls, которые он будет создавать, будут известны по их полному пути (например, System.Web.UI.WebControls.whatever). Причина этого в том, что я позволяю пользователю решать, какие элементы управления будут размещены на веб-странице. Конечно, есть больше сложности, чем это, но это все в двух словах.

Проще говоря, как мне создать WebControl на веб-странице по его полному пути?

Я понимаю, что ответ, вероятно, закончится использованием отражения, но у меня мало опыта использования отражения, и я не хочу стрелять себе в ногу, совершив ошибку новичка.


person Jagd    schedule 02.03.2010    source источник
comment
Все ли возможные типы известны во время компиляции? Это даст вам еще несколько вариантов. Рефлексия, безусловно, возможна, но может стать проблемой, если вам нужно установить множество индивидуальных свойств для каждого веб-элемента управления.   -  person Matt Dearing    schedule 02.03.2010
comment
Вы делаете хорошее замечание, и я знал, что в какой-то момент мне придется заняться этим, если я пойду в этом направлении. По правде говоря, я все еще не уверен, что пойду по этому пути, потому что, как вы сказали, есть множество свойств, к которым я буду обращаться в веб-элементах управления, и я не был уверен, насколько сложно будет добавиться при попытке получить к ним доступ.   -  person Jagd    schedule 02.03.2010


Ответы (2)


попробуйте позвонить так: Activator.CreateInstance(Type.GetType("TypeName"));

где TypeName — это полное имя, включая сборку. в моем случае это выглядело так:

Activator.CreateInstance(Type.GetType("System.Web.UI.WebControls.Label, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"));

чтобы быть уверенным в полном имени в вашем случае, попробуйте вывести typeof(System.Web.UI.WebControls.Label).FullName и использовать его как шаблон

person Andrey    schedule 02.03.2010
comment
Единственное, что нужно помнить, это то, что Activator работает только с общедоступными классами, которые реализуют конструктор по умолчанию, то есть конструктор без параметров. - person Paulo Santos; 02.03.2010
comment
я не согласен. Он может создавать экземпляры частных классов, если вам удастся выкопать объект Type из объекта Assembly. про безпараметрический конструктор тоже неправда, можно передавать параметры конструктору вторым параметром в CreateInstance - person Andrey; 02.03.2010

object widget = Activator.CreateInstance ( Assembly.GetType ( name ) );

где имя — это строка полностью определенного типа

person JDMX    schedule 02.03.2010
comment
Единственное, что нужно помнить, это то, что Activator работает только с общедоступными классами, которые реализуют конструктор по умолчанию, то есть конструктор без параметров. - person Paulo Santos; 02.03.2010
comment
Я думаю, что это близко, но еще не совсем так. В Assembly нет статического метода GetType(), но экземпляр Assembly, конечно, имеет. - person Jagd; 02.03.2010
comment
вы также можете сделать typeof( x ), чтобы получить тип, необходимый для Activator.CreateInstance. x затем равняется System.Web.UI.WebControls.Label, System.Web.UI.WebControls.Textbox или любому другому типу, который вы хотите динамически создавать - person JDMX; 02.03.2010