我可以通过提供名称来使用反射来获取现有变量吗?

时间:2011-06-05 01:08:06

标签: c# asp.net reflection refactoring

我正在接管某人的工作,并且有很多重复的代码。现在,我只想更改以下代码:(我想要更改的代码是在此代码块之后)

        if (Session["opt3PSRAddHrs4"] != null)
        {
            lblDay4AddHrs.Text = "Additional Hours: " + (String)Session["opt3PSRAddHrs4"];
        }
        else
        {
            lblDay4AddHrs.Visible = false;
        }



        if (Session["opt3PSRAddHrs5"] != null)
        {
            lblDay5AddHrs.Text = "Additional Hours: " + (String)Session["opt3PSRAddHrs5"];
        }
        else
        {
            lblDay5AddHrs.Visible = false;
        }

        if (Session["opt3PSRAddHrs6"] != null)
        {
            lblDay6AddHrs.Text = "Additional Hours: " + (String)Session["opt3PSRAddHrs6"];
        }
        else
        {
            lblDay6AddHrs.Visible = false;
        }

        if (Session["opt3PSRAddHrs7"] != null)
        {
            lblDay7AddHrs.Text = "Additional Hours: " + (String)Session["opt3PSRAddHrs7"];
        }
        else
        {
            lblDay7AddHrs.Visible = false;
        }

for (int i = 0; i < 7; i++) {

   Label label = Reflection.getVariable(type = "Label", name = "lblDay" + i + "AddHrs");
   string sessionData = (string) Session["opt3PSRAddHrs" + i];
   if ( sessionData != null) {
      label.Text = "Additional Hours: " + sessionData;
   }
   else {
      label.Visible = false;
   }
}

使用反射。由于这些标签的名称遵循一种模式,反射可以帮助吗?

(顺便说一句,或许把所有opt3PSRAddHrs的东西都放在一个数组中是个好主意,但是你知道,现在我不想改变那部分代码......每一次改变都可能会留下不一致......)< / p>

1 个答案:

答案 0 :(得分:4)

反思不是答案。您应该使用Page.FindControl method代替。

要在页面级别找到标签,您可以使用:

Label label = (Label)FindControl("lblDay" + i + "AddHrs");

请注意,您需要在容纳标签的容器上使用它。例如,如果您的标签位于带Panel的{​​{1}}内,则可以使用ID="myPanel"