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

Posted

技术标签:

【中文标题】如何获取自定义用户控件的“typeof”【英文标题】:How to get the "typeof" of a custom user control 【发布时间】:2011-06-24 08:38:26 【问题描述】:

我有一个自定义用户控件 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 进行提取。 @Jaroslav 这就是答案。把它拍在底部,这样我们就可以给你信用:) 【参考方案1】:

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

对于比较,请使用 is 运算符。 对于提取,请使用control.GetType().BaseType

【讨论】:

唯一的问题似乎是在本机控件上调用 .BaseType 会返回“WebControl”。例如,对于一个文本框控件,control.GetType().BaseType 是“WebControl”。有什么想法吗? 根据命名约定,类名不应包含_。因此,如果类型为EndsWith("_ascx"),您可以确定它是一个用户控件并按照我的回答中的说明提取名称。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

您可以尝试使用关键字is。这不是一回事,但如果您要做的只是确定对象是否属于某种类型(或扩展/实现类/接口),那么这应该可以解决问题。

当然,根据您的代码,这可能无济于事。

【讨论】:

我今天刚遇到这个问题并且(myControl is TypeICareAbout)工作。 “is”关键字检查是否可以将变量转换为所需的类型而不会引发错误。见:msdn.microsoft.com/en-us/library/scekt9xw(v=vs.80).aspx【参考方案4】:

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()

来源:Compilation and Deployment in ASP.NET 2.0

【讨论】:

以上是关于如何获取自定义用户控件的“typeof”的主要内容,如果未能解决你的问题,请参考以下文章

wpf 自定义控件的自定义属性的数据绑定问题

ASP.NET用户自定义控件

C# wpf 如何实现自定义控件,布局时,大小发生变化,内部绘制的曲线跟随变化?

WinForm里的用户自定义控件如何半透明(急急)

如何引用VB6.0编 用户自定义控件

如何在自定义用户控件上创建单击事件?