【问题标题】:C# ASP.NET GetType() with WebUserControl issueC# ASP.NET GetType() 与 WebUserControl 问题
【发布时间】:2011-06-24 08:24:19
【问题描述】:

在项目中,我有一些用于表单元素的自定义 WebUserControl(它们封装了一些标准验证器和其他系统特定功能)。我的用户控件是“DropDownListField”和“TextBoxField”。在页面后面的代码中,我有以下代码:

string parameterValue = null;
foreach (object control in myMultiView.Views[myMultiView.ActiveViewIndex].Controls)
{
    if (control.GetType() == typeof(DropDownListField))
        parameterValue = ((DropDownListField)control).Value;
    if (control.GetType() == typeof(TextBoxField))
        parameterValue = ((TextBoxField)control).Value;
}

由于某种原因,“if”语句总是返回 false,即使我单步执行代码并看到“控件”被分配给我的 Web 用户控件。此代码在项目中的另一个位置完全相同,只是在另一个位置使用标准 .net 控件“TextBox”和“DropDownList”,而在另一个位置代码可以工作。

有人知道为什么这不适用于网络用户控件吗?

更新: 嗯,所以在调试时我发现了这个:

?control.GetType();
BaseType: {Name = "DropDownListField" FullName = "WebUI.UserControls.Fields.DropDownListField"}
?typeof(DropDownListField);
BaseType: {Name = "UserControl" FullName = "System.Web.UI.UserControl"}

所以 typeof 只是认识到它们是用户控件,而不是看起来的完整类型。

有人知道我将如何检查特定的用户控件类型吗?

【问题讨论】:

  • 我猜它们不是同一类型,使用调试找出实际类型。

标签: c# asp.net gettype webusercontrol


【解决方案1】:

我猜它们不是同一类型,使用调试找出实际类型。

另外,请尝试改用“is”关键字。

【讨论】:

  • "控制是 DropDownListField" 有效。谢谢你。您是否知道该检查与类型检查有何不同?
  • 'is' 检查类型兼容性,而与 '==' 比较则比较实际类型(由 Type 实例定义)
【解决方案2】:

PS:你说 if (control is DropDownListField) 可能更清楚

我不记得视图是否直接在 Controls 中包含其子项,但如果 Controls 仅包含一个元素,我不会感到惊讶,这将是某种容器。因此,您的控件可能位于 Controls[0].Controls 甚至更下方。我建议您创建一种递归查找孩子的方法。

实际上,您的控件都应该实现一个通用接口(例如:

interface ICustomFieldWithValue { string Value {get; set; }}

)。您生成的代码会更干净。

【讨论】:

  • "Is" 最终起作用了。仅供参考,当我单步执行该代码时,Control 会遍历几个文字和我的自定义控件,因此视图必须包含集合中的所有控件。
【解决方案3】:

c2.GetType().ToString() == "System.Web.UI.WebControls.Label"

【讨论】:

  • 请检查stackoverflow.com/tour,因为您的贡献似乎没有回答问题
  • 它确实回答了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2015-07-06
相关资源
最近更新 更多