我有一个可换肤的控件库,它从外部 xml 文件加载控件设置/属性。这些Xml
类在一个单独的项目中,因为它们将在皮肤编辑器应用程序中使用,现在的问题是,控件在构造函数中接受一个 xml 对象来构建,Control
但我需要找到一种创建每个控件的好方法。
xml类示例:
[Serializable]
[XmlInclude(typeof(XmlButton))]
[XmlInclude(typeof(XmlGroup))]
[XmlType(TypeName="Control")]
public class XmlControl
{
[DefaultValue(0)]
public int Width { get; set; }
[DefaultValue(0)]
public int Height { get; set; }
...
和每个控件类型的派生类型
[Serializable]
[XmlType(TypeName = "Button")]
public class XmlButton : XmlControl
{
public string Label { get; set; }
}
控制类
public class GUIControl : GUI3DBase
{
public GUIControl(XmlControl skinXml)
{
SkinXml = skinXml;
...
public class GUIButton : GUIControl, IActionControl
{
public GUIButton(XmlControl skinXml) : base(skinXml)
{
}
...
现在这是我需要帮助的地方,目前我有一个方法可以根据传入的 xml 对象创建控件。
public static GUIControl CreateControl<T>(T skinXml) where T : XmlControl
{
if (skinXml is XmlButton)
{
return new GUIButton(skinXml);
}
else if (skinXml is XmlGroup)
{
return new GUIGroup(skinXml);
}
....
我有大约 30 个控件,并且“if 阶梯”正在快速增长,我觉得我缺少一种创建这些控件的简单方法,而无需检查 xml 对象类型然后创建相应的控件类型。
我不能Type
在 Xml 对象中添加属性,因为这会创建循环依赖。
任何对良好工厂方法或新结构布局的帮助都会很棒