c# - 从其基类调用继承的方法

标签 c# .net

我有一个抽象类,用于派生许多其他类,每个类都做类似但略有不同的事情。这些类由反射加载并暴露给用户,以选择他需要运行的一个。

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

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

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

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

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

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

我希望这听起来不会很困惑:(

最佳答案

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

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();
}

关于c# - 从其基类调用继承的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10339676/

相关文章:

C# ToolStrip 是透明的但边框仍然可见?

c# - 摆脱不必要的循环

c# - 如何从字符串中去除非字母数字字符(包括空格)?

c# - 在 WPF 程序中防止电视/显示器老化

.net - ASP.NET Web API(测试版)是否可以与最新的 Mono(稳定版)一起运行?

c# - C# 中的自定义 Windows 控件库

c# - Entity Framework 查询思路(group by)

c# - 如何增加 .net core 2.1 文件上传的大小?

c# - 我创建了一个修改过的吃 bean 人,如何让他喷火?

c# - Microsoft CRM SDK 使用 Guid 作为查询条件值