当我不知道类型时,是否可以在仅在实例类型上声明的对象上设置属性?

时间:2009-11-04 23:14:50

标签: reflection object types instance propertyinfo

让我解释一下。我有一个List我要添加各种ASP.NET控件。 然后我希望遍历列表并设置一个CssClass,但并不是每个Control都支持属性CssClass。

我想要做的是测试底层实例类型是否支持CssClass属性并设置它,但我不确定如何在设置属性之前进行转换,因为我不知道每个属性的类型控制对象。

我知道我可以使用typeof或x.GetType(),但我不知道如何使用它们将控件转换回实例类型以便测试然后设置属性。


实际上我似乎已经解决了这个问题,所以我想我会在这里为其他人发布代码。

foreach (Control c in controlList) {
    PropertyInfo pi = c.GetType().GetProperty("CssClass");
    if (pi != null) pi.SetValue(c, "desired_css_class", null);
}

我希望这可以帮助其他人,因为我花了我几个小时来研究这两行代码。

干杯

史蒂夫

2 个答案:

答案 0 :(得分:0)

为了跟随Preet的建议,我也发布了这个答案。

foreach (Control c in controlList) {
    PropertyInfo pi = c.GetType().GetProperty("CssClass");
    if (pi != null) pi.SetValue(c, "desired_css_class", null);
}

我希望这有助于未来的某些人(可能是我再次谷歌时)。

答案 1 :(得分:0)

您可能需要考虑重新设计这些类,使它们实现接口ICssControl或提供CssClass属性的行。

interface ICssControl

{   string CssClass {get;组;}  }

然后,您可以将您的逻辑实现为:

string desiredCssClass = "desired_css_class";
foreach (var control in controlList)
{
    var cssObj = control as ICssControl;
    if (cssObj != null)
        cssObj.CssClass = desiredCssClass;
}

这使您无需使用反射,并且应该在以后更容易进行重构。

修改

在重新阅读你的问题时,也许你已经有了这个界面,并且正在询问如何将它转回该界面?