Ответ 1
ASP.NET создает собственный тип, унаследованный от пользовательских элементов управления.
Для сравнения используйте оператор is
.
Для извлечения используйте control.GetType().BaseType
.
У меня есть пользовательский элемент управления DatePicker.cs. Внутри другой части кода у меня есть набор элементов управления, где я проверяю тип элемента управления и выполняю некоторую логику, основанную на типе. Моя проблема заключается в следующем:
typeof(DatePicker)
Эвалюты:
{Name = "DatePicker" FullName = "cusitecore.cedarsc.UserControls.DatePicker"}
Но когда я запускаю отладчик и смотрю на тип элемента управления, который находится в моей веб-форме, это:
{Name = "cedarsc_usercontrols_datepicker_ascx" FullName = "ASP.cedarsc_usercontrols_datepicker_ascx"}
Эти две вещи не равны, поэтому правильная логика не оценивается. Я пробовал использовать Type.GetType( "ASP.cedarsc_usercontrols_datepicker_ascx" ), но это возвращает null.
ИЗМЕНИТЬ
Вот что я пытаюсь сделать:
private readonly Dictionary<Type, ControlType?> _controlTypes = new Dictionary<Type, ControlType?>
{
{typeof(CheckBox), ControlType.CheckBox},
{typeof(CheckBoxList), ControlType.CheckBoxList},
{typeof(DropDownList), ControlType.DropDownList},
{typeof(HiddenField), ControlType.HiddenField},
{typeof(ListBox), ControlType.ListBox},
{typeof(RadioButton), ControlType.RadioButton},
{typeof(RadioButtonList), ControlType.RadioButtonList},
{typeof(TextBox), ControlType.TextBox},
{typeof(Label), ControlType.Label},
{typeof(DatePicker), ControlType.DatePicker},
{typeof(CustomSelect), ControlType.CustomSelect}
};
private void PopulateFields(Control control)
{
ControlType? controlType;
_controlTypes.TryGetValue(control.GetType(), out controlType);
// recurse over the children
if (control.Controls.Count > 0 && controlType == null) // don't want to recurse into children of controls we are reading values of
{
foreach(Control childControl in control.Controls)
{
PopulateFields(childControl);
}
}
if (controlType != null)
{
switch (controlType)
{
case ControlType.CheckBox:
case ControlType.RadioButton:
CheckBox checkBox = control as CheckBox;
if (checkBox != null)
_fields.AddFieldValue(checkBox.ID, checkBox.Checked ? "Checked" : "Not Checked");
break;
case ControlType.CheckBoxList:
case ControlType.ListBox:
case ControlType.RadioButtonList:
ListControl listControl = control as ListControl;
if (listControl != null)
_fields.AddFieldValue(listControl.ID, String.Join(", ", listControl.Items.Cast<ListItem>().Where(item => item.Selected).Select(item => item.Value).ToArray()));
break;
case ControlType.DropDownList:
DropDownList dropDownList = control as DropDownList;
if (dropDownList != null)
_fields.AddFieldValue(dropDownList.ID, dropDownList.SelectedValue);
break;
case ControlType.HiddenField:
HiddenField hiddenField = control as HiddenField;
if (hiddenField != null)
_fields.AddFieldValue(hiddenField.ID, hiddenField.Value);
break;
case ControlType.TextBox:
TextBox textBox = control as TextBox;
if (textBox != null)
_fields.AddFieldValue(textBox.ID, textBox.Text);
break;
case ControlType.DatePicker:
DatePicker datePicker = control as DatePicker;
if (datePicker != null)
_fields.AddFieldValue(datePicker.ID, datePicker.Text);
break;
case ControlType.CustomSelect:
CustomSelect customSelect = control as CustomSelect;
if(customSelect != null)
_fields.AddFieldValue(customSelect.ID, customSelect.SelectedValue);
break;
case ControlType.Label:
Label label = control as Label;
if(label != null)
_fields.AddFieldLabel(label.AssociatedControlID, label.Text);
break;
default:
throw new Exception("Unhandled Control");
}
}
}
ASP.NET создает собственный тип, унаследованный от пользовательских элементов управления.
Для сравнения используйте оператор is
.
Для извлечения используйте control.GetType().BaseType
.
Ваше сообщение не совсем вникает в то, как вы собираетесь это использовать, но у меня никогда не было проблем с typeof(), используемым в моих событиях. Например, у меня будет следующий if-statement в событии, относящемся к зависанию:
if (sender.GetType() == typeof(Transparent_Panel))
где Transparent_Panel был настраиваемым пользовательским элементом управления. Я никогда не делал никакой специальной работы под капотом с Tansparent_Panel, чтобы выполнить эту работу.
Вы можете попробовать использовать ключевое слово is
. Это не совсем то же самое, но если все, что вы пытаетесь сделать, это определить, имеет ли объект определенный тип (или расширяет/реализует класс/интерфейс), тогда это должно сделать трюк.
Конечно, в зависимости от вашего кода это может не помочь.
ASP.NET 2.0 и более поздние версии будут компилировать каталог UserControl
в каталог временных файлов ASP.NET по запросу, поэтому тип, который вы просматриваете, когда вы смотрите на тип элемента управления в отладчике, автоматически генерируется механизм компиляции ASP.NET. Хорошей новостью является то, что этот тип наследуется от типа DatePicker
, поэтому следующий код должен работать, чтобы проверить, действительно ли данный UserControl
a DatePicker
:
typeof(DatePicker).IsAssignableFrom(userControl.GetType().BaseType)
В качестве альтернативы вы всегда можете создать экземпляр DatePicker
UserControl
во время выполнения и проверить эквивалентность типов с помощью:
LoadControl(typeof(DatePicker)).GetType() == userControl.GetType()
Источники: Компиляция и развертывание в ASP.NET 2.0