[英]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[]
传递。 Type
或Type[]
应该很好-不是“过大杀伤力”-这是描述类型的适当且预期的方式。 此外,您可以通过以下简单实例化:
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.