.Net - 如何创建实现接口的UserControl?LoadControl出错

rus*_*sty 3 .net c# inheritance user-controls

我有一些UserControls,我想每个都有一些基本的功能.以下是我的实施:

public interface IMyTabInterface
{
    void LoadData();
}

public partial class MyFirstTab : System.Web.UI.UserControl, IMyTabInterface
{
    public void LoadData()
    {
        ...
    }

}
Run Code Online (Sandbox Code Playgroud)

然后,在另一页的代码背后,我尝试:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

我知道这很不正确,但我在LoadControl()行上出错了:

这里不允许'MyFirstTab',因为它没有扩展类'System.Web.UI.UserControl'

即使该类明确扩展了UserControl类.这里发生了什么?有一个更好的方法吗?

Ode*_*ded 5

这将有效:

var myFirstTab = (IMyTabInterface)uControl1;
var mySecondTab = (IMyTabInterface)uControl2;

myFirstTab.LoadData();
mySecondTab.LoadData();

Panel1.Controls.Add((Control)myFirstTab);
Panel1.Controls.Add((Control)mySecondTab);
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?

myFirstTabmySecondTab变量是类型的IMyTabInterface,因为这是你声明它们的(这是允许你调用LoadData它们的东西).

但是,为了一个项添加到控件集合中,这些项必须是类型Control(或从中继承的类型) - 这是通过强制转换实现的.


另外一个选项:

var myFirstTab = (IMyTabInterface)uControl1;
var mySecondTab = (IMyTabInterface)uControl2;

myFirstTab.LoadData();
mySecondTab.LoadData();

Panel1.Controls.Add(uControl1);
Panel1.Controls.Add(uControl2);
Run Code Online (Sandbox Code Playgroud)

在这里,您使用Control您开始使用的原始类型,因此无需强制转换.