C# 从基类调用继承的方法

C# 从基类调用继承的方法,c#,.net,C#,.net,我有一个抽象类,用于派生几十个其他类,每个类做相似但略有不同的事情。这些类通过反射加载并公开给用户,以选择他需要运行的类 这是因为基类有一个名为Run的抽象方法,该方法由每个派生类重写。因此,在代码中任何需要这些类型变量的地方,我都将它们声明为基类。然后,当我调用Run方法时,它从实类型执行该方法(即使我将其声明为基类) 我的问题是,我需要为每个派生类显示一个定制的UI。我想为每个控件创建一个自定义用户控件。这些控件将有一个puclic方法,根据用户对其所做的操作返回一个值。然后我在运行时创建这

我有一个抽象类,用于派生几十个其他类,每个类做相似但略有不同的事情。这些类通过反射加载并公开给用户,以选择他需要运行的类

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

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

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

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

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

还有,这会是一个设计问题吗?我可以用其他方法来做吗


我希望这听起来不太令人困惑:(

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

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();
}
公共抽象类基类,其中T:UserControl,IMyControl
{
私人网页(u页),;
受保护的T控件{get;private set;}
公共基类(第页,字符串控制路径)
{
_页码=页码;
Control=(T)page.LoadControl(controlPath);
_page.Controls.Add(控件);
}
公开募捐
{
var data=Control.GetData();
}
}
公共接口IMyControl
{
对象GetData();
}

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

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();
}
公共抽象类基类,其中T:UserControl,IMyControl
{
私人网页(u页),;
受保护的T控件{get;private set;}
公共基类(第页,字符串控制路径)
{
_页码=页码;
Control=(T)page.LoadControl(controlPath);
_page.Controls.Add(控件);
}
公开募捐
{
var data=Control.GetData();
}
}
公共接口IMyControl
{
对象GetData();
}

我会创建一个继承自UserControl的类。我不认为可以将其抽象化,但可以在另一个类型上创建一个名为CreateControl()的方法,该方法将返回该UserControl的一个实例,该实例应包含UI


然后,您可以将该UserControl添加到面板或其他容器中,而不必真正关心它是什么特定的UserControl。如果您希望实现该UserControl的特定方法,如Save或Load,则可以将其作为虚拟方法添加到从UserControl派生的基类中。

继承自UserControl的类。我不认为可以将其抽象化,但可以在另一个类型上创建一个名为CreateControl()的方法,该方法将返回该UserControl的实例,该实例应包含UI


然后,您可以将该UserControl添加到面板或其他容器中,而不必真正关心它是什么特定的UserControl。如果您希望实现该UserControl的特定方法,如Save或Load,则可以将其作为虚拟方法添加到从UserControl派生的基类中。

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

从基类派生的每个类都有一个可重写的方法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 ...>
objectui=FindControlByName(“SelectedClassUI”);
类型t=ui.GetType();
MethodInfo m=t.GetMethod(“读取数据”);
objectusersetup=m.Invoke(ui,null);

我不知道这是正确的还是最好的解决方案,但根据上述答案和一些研究,我用以下方式解决了问题:

从基类派生的每个类都有一个可重写的方法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 ...>
objectui=FindControlByName(“SelectedClassUI”);
类型t=ui.GetType();
MethodInfo m=t.GetMethod(“读取数据”);
objectusersetup=m.Invoke(ui,null);

是否存在现有的插件?(即,您是否需要担心向后兼容性?)这是完全可能的,而且您走在了正确的轨道上-使用泛型您可以