如何获取自定义用户控件的“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”的主要内容,如果未能解决你的问题,请参考以下文章