Как получить "тип" настраиваемого пользовательского элемента управления

У меня есть пользовательский элемент управления 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");
        }
    }
}

Ответ 1

ASP.NET создает собственный тип, унаследованный от пользовательских элементов управления.

Для сравнения используйте оператор is.
Для извлечения используйте control.GetType().BaseType.

Ответ 2

Ваше сообщение не совсем вникает в то, как вы собираетесь это использовать, но у меня никогда не было проблем с typeof(), используемым в моих событиях. Например, у меня будет следующий if-statement в событии, относящемся к зависанию:

if (sender.GetType() == typeof(Transparent_Panel))

где Transparent_Panel был настраиваемым пользовательским элементом управления. Я никогда не делал никакой специальной работы под капотом с Tansparent_Panel, чтобы выполнить эту работу.

Ответ 3

Вы можете попробовать использовать ключевое слово is. Это не совсем то же самое, но если все, что вы пытаетесь сделать, это определить, имеет ли объект определенный тип (или расширяет/реализует класс/интерфейс), тогда это должно сделать трюк.

Конечно, в зависимости от вашего кода это может не помочь.

Ответ 4

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