【问题标题】:How to use reflection to cast a control as its type in order to modify properties?如何使用反射将控件转换为其类型以修改属性?
【发布时间】:2015-07-04 12:55:20
【问题描述】:

这是我目前所做的一个例子:

book enable = false;
foreach (Control c in controlList)
{
    if (c is MyTextBox)
    {
        (c as MyTextBox).Enabled = enable;
    }
    if...
    ...
}

除了为每种类型的控件设置多个 if 语句之外,有没有一种方法可以获取控件的类型以便进行强制转换,然后能够访问和设置该控件的属性?

【问题讨论】:

  • Enabled 是 Control 基类的一个属性,所以为什么要强制转换它,只需设置 c.Enabled = enable,除非有其他原因?
  • 顺便说一句,我向你保证,使用反射来做这件事会更加冗长。如果您需要转换,您已经验证了类型,因此您应该使用直接转换,而不是“as”运算符,因为它有额外的开销。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。

标签: c# list reflection properties controls


【解决方案1】:

这是使用反射的一个很好的例子。

Control 类包含一个Enabled 属性,可用于Control 的所有后代以更改其启用状态。因此,更改控件集合的启用状态的简单方法是:

bool enable = false;
foreach (Control c in controlList)
    c.Enabled = enable;

或者(现在您已经提到了 System.Web.UI 命名空间)您可以为您的 WebControl 派生对象执行此操作,假设 controlList 集合可以包含派生自 Control 但不一定来自WebControl

foreach (WebControl c in controlList.OfType<WebControl>())
    c.Enabled = enable;

反射在某些情况下很方便,你可以用它做一些很酷的事情。有时它很冗长,而且有点难以理解,而且通常可以通过其他更简单的方式完成。

如果您有一个不同类型的任意对象的集合,其中一些可能具有您可以设置的bool Enabled 属性,但不能保证它们具有一个共同的基类,这将是有用的。您可以访问 Enabled 属性。然后你可以这样做:

bool enabled = false;
foreach (var obj in objectList)
{
    var tObj = obj.GetType();
    PropertyInfo piEnabled = tObj.GetProperty("Enabled", typeof(bool));
    if (piEnabled != null && piEnabled.CanWrite)
        piEnabled.SetValue(obj, enabled);
}

比简单地通过Control 父类访问属性要复杂得多、不透明,而且要慢得多很多

【讨论】:

  • 谢谢这是我最初的想法,但即使我引用 System.Web.UI,它也不会识别 enabled 属性。我还有什么需要做的吗?
  • @Tom 哦,您应该指定您使用的是 Web 控件而不是表单控件。那么你想要的是WebControl 而不是Control。这就是Enabled 属性在System.Web.UI 类中的位置。如果您访问您正在使用的任何控件的 MSDN 页面并显示所有继承的属性,它将告诉您它从哪个基类继承该属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 2018-01-30
  • 1970-01-01
相关资源
最近更新 更多