问题 如何获取自定义用户控件的“typeof”


我有一个自定义用户控件DatePicker.cs。在另一段代码中,我有一组控件,我正在检查控件的类型并根据类型做一些逻辑。我的问题如下:

typeof(DatePicker)

评估:

{Name = "DatePicker" FullName = "cusitecore.cedarsc.UserControls.DatePicker"}

但是当我运行调试器并查看我的Web表单上的控件类型时,它是:

{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");
        }
    }
}

10726
2018-02-09 18:43


起源

你能提供一些更多的背景吗?你的代码是什么样的,试图在两种类型之间进行比较? - Kirk Woll
ASP.NET创建了自己从用户控件继承的类型。使用 is 用于比较的关键字并尝试 control.GetType().BaseType 用于提取。 - Jaroslav Jandek
@Jaroslav这是答案。把它压到底部,这样我们可以给你信任:) - Kyle


答案:


ASP.NET创建自己继承自用户控件的类型。

比较使用 is 运营商。
用于提取使用 control.GetType().BaseType


11
2018-02-09 19:07



唯一的问题似乎是在本机控件上调用.BaseType会返回“WebControl”。因此,例如对于作为TextBox的控件,control.GetType()。BaseType是“WebControl”。有什么想法吗? - Kyle
根据命名约定,classname不应包含 _。所以,如果类型 EndsWith("_ascx"),您可以非常肯定它是一个用户控件并提取名称,如我的答案中所述。 - Jaroslav Jandek


你的帖子并没有详细说明你打算如何使用它,但我的事件中使用的typeof()从来没有遇到任何问题。例如,我将在处理悬停的事件中使用以下if语句:

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

其中Transparent_Panel是自定义用户控件。我从未与Tansparent_Panel进行任何特殊的幕后工作来完成这项工作。


2
2018-02-09 19:01





您可以尝试使用该关键字 is。它并不完全相同,但如果您要做的就是确定一个对象是否属于某种类型(或扩展/实现一个类/接口),那么应该这样做。

当然,根据您的代码,这可能没有帮助。


1
2018-02-09 18:55



我今天刚遇到这个问题而且(myControl是TypeICareAbout)工作了。 “is”关键字检查是否可以将变量强制转换为所需类型而不抛出错误。看到: msdn.microsoft.com/en-us/library/scekt9xw(v=vs.80).aspx - William


ASP.NET 2.0及更高版本将编译 UserControl 按需访问Temporary ASP.NET Files目录,因此当您查看调试器中控件的类型时,您正在检查的类型是由ASP.NET编译引擎自动生成的。好消息是这种类型继承自 DatePicker 类型,所以下面的代码应该工作,以测试是否给定 UserControl 实际上是一个 DatePicker

typeof(DatePicker).IsAssignableFrom(userControl.GetType().BaseType)

或者,您始终可以创建一个实例 DatePicker  UserControl 在运行时通过以下方式检查类型等价:

LoadControl(typeof(DatePicker)).GetType() == userControl.GetType()

资料来源: ASP.NET 2.0中的编译和部署


1
2018-02-09 19:05



感谢对此的进一步解释 - Kyle