我有一个说明setMaster()的界面; 和2个类,我根据场景设置各自的母版页。
我需要了解以下代码的含义:
Control pageControl = LoadControl(pageControlPath);
if (pageControl is IVariableMasterPageControl)
{
((IVariableMasterPageControl)pageControl).setMaster();
}
我的代码:
接口:
interface IVariableMasterPageControl
{
void setMaster();
}
类:
public class VariableMasterControl1 : System.Web.UI.UserControl, IVariableMasterPageControl
{
public void setMaster()
{
this.Page.MasterPageFile = ("~/ui/" + SiteConfiguration.UIID + "/MasterPageOne.Master");
}
}
答案 0 :(得分:2)
您要显示的代码会动态加载UserControl。对LoadControl
方法的调用返回类型为Control
的实例。这可以是任何可能实现或不实现接口IVariableMasterPageControl
的控件。因此,如果要调用setMaster
方法,则需要在访问接口控件之前检查控件是否实现了接口。这就是if
语句正在做的事情。
is
语句检查object is compatible with a given type是否可以转换为该类型。在你的情况下,行
if (pageControl is IVariableMasterPageControl)
检查pageControl
是否实现IVariableMasterPageControl
,以便它可以在下一行安全地投射它。
由于您之后需要引用该接口,另一种方法是使用as
运算符:
Control pageControl = LoadControl(pageControlPath);
var varMasterPageCtrl = pageControl as IVariableMasterPageControl;
if (varMasterPageCtrl != null)
varMasterPageCtrl.setMaster();
答案 1 :(得分:0)
在我看来,您正在进行自定义ASCX控件,其中一些控件实现了IVariableMasterPageControl接口。如果有问题的控件是否实现了接口,那么您无法理解的代码就是检查。如果是,它将访问控件的方法setMaster() - 显然必须实现。
代码
if (pageControl is IVariableMasterPageControl)
是否进行检查的部分是否检查控件是否实际实现了接口。这也可以通过以下方式完成;
if (pageControl.GetType() == typeof(IVariableMasterPageControl))
请看一下这个链接:How to compare types。可以帮助您比较类型并更深入地理解这个概念。
答案 2 :(得分:0)
在这种情况下,is
关键字基本上表示:"如果PageControl
的此实例实现了接口IVariableMasterPageControl
,则调用接口{{1} } SetMaster()
。"
使用PageControl
关键字进行的检查可确保您的对象实际已方法is
进行调用。您可以遍历一堆SetMaster()
个对象,但并不保证所有这些对象都会实现该接口。在没有检查的情况下调用不存在的方法肯定会导致PageControl
或者甚至可能调用错误的代码(例如,如果其中一个Exception
对象实现另一个恰好也是定义方法PageControl
)的接口。