从其基类调用继承的方法

时间:2012-04-26 18:58:34

标签: c# .net

我有一个抽象类,用于派生许多其他类,每个类做类似但略有不同的东西。这些类由Reflection加载并向用户公开,以选择他需要运行哪一个。

这项工作是因为基类有一个名为Run的抽象方法,它被每个派生类覆盖。因此,在我需要任何这些类型的变量的代码中的任何地方,我都将它们声明为基类。然后当我调用Run方法时,它从真实类型执行方法(即使我将它声明为基类)。

我的问题是我需要为每个派生类显示一个自定义的UI。我想为每个人制作一个自定义的UserControl。这些控件将有一个puclic方法,它根据用户对其进行的操作返回一个值。然后我在运行时创建这个控件,用户设置需要的东西,我从这个控件调用return方法,最后我可以从用户选择的类中将i传递给Run Run方法并执行它。

我不知道我有多少个或哪个派生类,因为用户可以创建从该基类派生的dll并将其作为插件附加。

因此我认为我必须在表单上创建这些自定义控件作为通用UserControl类,然后将它们转换为真实类型。但有没有办法做到这一点,只知道控件是从UserControl派生出来的?

我可以在基类上创建一个公共属性来存储它的自定义控件,但是回到主代码我可以将通用用户控件转换为存储在这个属性中的类型吗?

另外,这里会出现设计问题吗?我可以使用其他方法来做到这一点吗?

我希望听起来不会让人感到困惑:(

3 个答案:

答案 0 :(得分:3)

我可能误解了你,但这就是我的想法:

public abstract class BaseClass<T> where T: UserControl, IMyControl
{
    private Page _page;
    protected T Control { get; private set;}

    public BaseClass(Page page, string controlPath)
    {
        _page = page;
        Control = (T)page.LoadControl(controlPath);
        _page.Controls.Add(Control);
    }

    public void Run()
    {
        var data = Control.GetData();
    }
}

public interface IMyControl
{
    object GetData();
}

答案 1 :(得分:1)

我会创建一个继承自UserControl的类。我不认为你可以使它成为Abstract,但你可以在你的另一个类型CreateControl()上创建一个方法,它将返回应包含UI的UserControl实例。

然后,您可以将UserControl添加到Panel或其他一些容器中,而无需实际关注具体的UserControl。如果有特定的方法你想要实现UserControl,比如保存或加载,那么你可以在Base类中添加那些来自UserControl的虚拟方法。

答案 2 :(得分:0)

我不知道这是否是正确或最佳的解决方案,但基于上述答案和一些研究,我以这种方式解决了问题:

从BaseClass派生的每个类都有一个可覆盖的GetControl方法。此方法返回专门为该类设计的UserControl的新实例。

当用户选择派生类时,我调用GetControl方法并添加此控件来执行表单。然后显示该类的设计UI。如果选择了另一个类,则会删除此控件,然后为该另一个类创建新UI。

为了阅读用户在控件中进行的设置,我在每个UserControl上实现了一个名为ReadData的方法。要从对象级别调用此方法,我使用了反射:

Object ui = FindControlByName("SelectedClassUI");
Type t = ui.GetType();
MethodInfo m = t.GetMethod("ReadData");
Object userSetup = m.Invoke(ui, null);

<... do something with userSetup ...>