我有许多UserControls,我想每个都有一些基本的功能。以下是我的实施:
public interface IMyTabInterface
{
void LoadData();
}
public partial class MyFirstTab : System.Web.UI.UserControl, IMyTabInterface
{
public void LoadData()
{
...
}
}
然后,在其他页面的代码后面,我尝试:
protected void LoadFirstTab()
{
Control uControl1 = Page.LoadControl("/Controls/MyFirstTab.ascx");
Control uControl2 = Page.LoadControl("/Controls/MySecondTab.ascx");
// Want to do something like this, but don't get this far... :
var myFirstTab = (IMyTabInterface)uControl1;
var mySecondTab = (IMyTabInterface)uControl2;
myFirstTab.LoadData();
mySecondTab.LoadData();
Panel1.Controls.Add(myFirstTab);
Panel1.Controls.Add(mySecondTab);
}
我知道这很不正确,但我在LoadControl()行上收到错误:
此处不允许'MyFirstTab',因为它不会扩展类'System.Web.UI.UserControl'
即使该类明确扩展了UserControl类。这里发生了什么?有更好的方法吗?
答案 0 :(得分:5)
这将有效:
var myFirstTab = (IMyTabInterface)uControl1;
var mySecondTab = (IMyTabInterface)uControl2;
myFirstTab.LoadData();
mySecondTab.LoadData();
Panel1.Controls.Add((Control)myFirstTab);
Panel1.Controls.Add((Control)mySecondTab);
发生了什么事?
您的myFirstTab
和mySecondTab
变量的类型为IMyTabInterface
,因为这是您声明的变量(这是允许您在其上调用LoadData
的变量)。
但是,为了将项添加到控件集合中,这些项必须是Control
类型(或从中继承的类型) - 这是通过强制转换实现的。
另一种选择:
var myFirstTab = (IMyTabInterface)uControl1;
var mySecondTab = (IMyTabInterface)uControl2;
myFirstTab.LoadData();
mySecondTab.LoadData();
Panel1.Controls.Add(uControl1);
Panel1.Controls.Add(uControl2);
在这里,您使用原始的Control
类型,因此无需强制转换。