创建处理多种类型控件的方法

时间:2010-03-30 23:26:03

标签: c# asp.net generics

我正在尝试创建一种接受多种控件的方法 - 在本例中为Labels和Panels。转换不起作用,因为IConvertible不会转换这些类型。任何帮助都会非常感激。 提前致谢

public void LocationsLink<C>(C control)
    {
        if (control != null)
        {
            WebControl ctl = (WebControl)Convert.ChangeType(control, typeof(WebControl));
            Literal txt = new Literal();
            HyperLink lnk = new HyperLink();
            txt.Text = "If you prefer a map to the nearest facility please ";
            lnk.Text = "click here";
            lnk.NavigateUrl = "/content/Locations.aspx";
            ctl.Controls.Add(txt);
            ctl.Controls.Add(lnk);
        }
    }

1 个答案:

答案 0 :(得分:3)

你不希望控件的where约束如此:

public void LocationsLink<C>(C control) where C : WebControl
{
    if (control == null)
        throw new ArgumentNullException("control");

    Literal txt = new Literal();
    HyperLink lnk = new HyperLink();
    txt.Text = "If you prefer a map to the nearest facility please ";
    lnk.Text = "click here";
    lnk.NavigateUrl = "/content/Locations.aspx";
    control.Controls.Add(txt);
    control.Controls.Add(lnk);
}

where约束强制control为WebControl类型,因此不需要进行转换。由于where约束,您知道control是一个类,可以与null进行比较,并且它具有Controls集合。

如果control为null,我还会更改代码以抛出异常。如果您真的只想忽略传递null参数的情况,那么只需将throw new ArgumentNullException("control");更改为return null;即可。鉴于编译约束,我认为将null传递给您的例程将是意外的并且应该抛出异常但是我不知道您的代码将如何被使用。