我正在尝试创建一种接受多种控件的方法 - 在本例中为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);
}
}
答案 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传递给您的例程将是意外的并且应该抛出异常但是我不知道您的代码将如何被使用。