繁体   English   中英

C#:创建一个类数组

[英]C#: Create an array of classes

我想创建一个类列表,从中可以在表单中构建“工具箱”。 它归结为一个可能的小部件列表,我可以将其拖放到Panel 这些类将实现相同的接口,并具有一些静态方法来创建列表。

我有一些代码:

public interface IWidget {
   Image image { get; }
}

public class Gauge : IWidget, PictureBox {
   public static Image image {
       get {
           return Properties.Resources.gauge;
       }
   }
}

在表单中,我想放置一个像这样的数组:

IWidget[] supported_widgets = { Gauge };

并遍历它们以创建用户可以使用类中的静态方法选择的工具箱,而不是通过实例化它们(当放置在Panel上时,它们将被实例化):

foreach (IWidget w in supported_widgets) {
    PictureBox p = new PictureBox();
    p.Image = w.getImage();

    toolbox.Controls.Add(p);
}

我尝试使用System.Type ,但是感觉有点过大了。 做这样的事情的最好方法是什么? 如果不实例化类,是否有可能?

IWidget表示小部件的实例,因此,如果尚未实例化它们,则不能将其作为IWidget[]传递。 TypeType[]应该很好-不是“过大杀伤力”-这是描述类型的适当且预期的方式。 此外,您可以通过以下简单实例化:

IWidget newInstance = (IWidget)Activator.CreateInstance(someConcreteWidgetType);

我想创建一个课程列表

从字面上看,这根本不可能。

您可以做的是创建对象(实例)列表。 这可以是您已经尝试过的Type类,也可以为每种类型创建一个辅助类。

 class WidgetHelper<T> where  T : IWidget, new() { }

然后您可能想向IWidget添加更多功能。

如果您不想使用Type对象,则可以使用Factory模式:

public interface IWidgetFactory
{
    IWidget makeWidget();
} 

public class WidgetFactory<TWidget> : IWidgetFactory where TWidget : IWidget, new() 
{
    IWidget makeWidget()
    {
        return new TWidget();
    }
}

IWidgetFactory[] supported_widgets = { new WidgetFactory<Gauge>(), new WidgetFactory<Indicator>() };

foreach (IWidgetFactory wf in supported_widgets) {
    PictureBox p = new PictureBox();
    p.Image = wf.makeWidget().getImage();

    toolbox.Controls.Add(p);
}

正如Marc所说,使用Type很好,您可以使用激活器来创建对象(将其放在面板中时)。 如果您只想使用静态方法来填充工具箱,则此处不创建类,请使用GetMethod()Invoke()

Type[] supported_widgets = { typeof(Gauge) };

foreach (var w in supported_widgets) {
    PictureBox p = new PictureBox();
    p.Image = w.GetMethod("getImage").Invoke(null, null);

    toolbox.Controls.Add(p);
}

在此答案范围之外,还有所有有关使用Reflection以及必须使用字符串来传递方法名称的注意事项,这在构造时非常脆弱且无济于事...请记住这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM