Как передать тип в UserControl - PullRequest
       12

Как передать тип в UserControl

1 голос
/ 19 февраля 2010

У меня есть UserControl (скажем, Foo.ascx), который имеет публичное свойство Type с именем Bar.Я ищу способ, которым, когда я объявляю этот usercontrol в представлении исходного кода части разметки, чтобы передать тип.например

<%@ Register Src="~/Controls/Foo.ascx" TagPrefix="prfx" TagName="fooCtrl" %>

и затем использовать его как

<prfx:fooCtrl ID="theId" runat="server" />

, если, например, я хотел передать элементу управления тип строки (такой как typeof (string)) что-тоиметь этот эффект

<prfx:fooCtrl ID="theId" runat="server" Bar="typeof(string)" />

как это можно сделать?Прежде чем кто-либо спросит, причина в том, что у меня есть много других свойств в этом пользовательском контроле, которые я передаю таким образом, и я хочу избежать использования CodeBehind просто для передачи типа

Ответы [ 2 ]

2 голосов
/ 19 февраля 2010

Вы можете добавить свойство типа string в свой пользовательский элемент управления, например, TypeName:

public string TypeName { get; set; } // Validation omitted for brevity

Затем измените реализацию вашего свойства Bar на:

public Type Bar { get { return Type.GetType(TypeName); } }

Так вы могли бы написать:

<prfx:fooCtrl ID="theId" runat="server" Bar="System.String" />

Иметь весь код, который должен использовать тип, для вызова свойства Bar.

1 голос
/ 19 февраля 2010

Краткий ответ, вы не можете этого сделать. Редактор и компилятор обрабатывают файлы .ascx как (в конце концов) XML. Это означает, что свойства «десериализации» могут быть преобразованы в различные примитивные типы, но не сложные типы, такие как System.Type. Чтобы работать, то, что вы хотели бы сделать, потребовало бы, в какой-то момент во время компиляции, чтобы атрибут в документе XML не обрабатывался как текст, не преобразовывался в простой тип, но интерпретировался и выполнялся как код. Без изменения работы Visual Studio и компилятора ASP.NET этого не произойдет.


Обход:

  1. Создайте публичное свойство типа string в вашем UserControl
  2. Передайте AssemblyQualifiedName того типа, который вы хотите передать в UserControl через этот атрибут
  3. Используйте перегрузку GetType (string) , чтобы получить экземпляр этого типа в вашем коде.

и, в коде:

/* ... */
var barType = Type.GetType(this.Bar);
// do whatever you want with this type
...