创建从XML读取其属性的对象的新实例

时间:2016-11-29 20:15:54

标签: c# xml

我在理解XML反序列化如何帮助我通过XML文件定义类时遇到了困难。

假设我有两种怪物的新XML定义文件,如下所示:

<MonstersCollection>
  <Monsters>
    <Monster>
      <MonsterName>Dragon<MonsterName>
      <HitPoints>100</Hitpoints>
    </Monster>
    <Monster>
      <MonsterName>Beast<MonsterName>
      <HitPoints>75</Hitpoints>
    </Monster>
  </Monsters>
</MonstersCollection>

使用XML反序列化器,我得到了一个很好的List,里面有我的2个不同的怪物,一切都很好。

但是,我怎样才能轻松优雅地在其他地方实例化一个新的龙怪或野兽怪物?

我是否必须克隆List中的相应对象,还是有其他方法可以执行此操作?

最终,我希望能够做一些简单的事情:

MonsterType monsterType = MonsterType.Dragon
Monster newMonster = new Monster(monsterType)

让构造函数使用XML定义文件中的Dragon数据自动填充此新对象属性。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

一种方法是使用工厂模式。如果你有一个从XML文件中获得的怪物集合,你应该创建一个工厂类,它将创建一个怪物类型的怪物。这样,您的创建逻辑就与模型分离了

你的代码看起来像......

public class MonsterFactory
{
    private readonly Monster[] _monsters;

    public MonsterFactory(Monster[] monsters)
    {
        _monsters = monsters;
    }

    public Monster CreateMonster(MonsterType monsterType)
    {
        return _monsters.First(e => e.MonsterName == monsterType);
    }
}

public enum MonsterType
{
    Dragon,
    Beast
}

public class Monster
{
    public MonsterType MonsterName { get; set; }
    public int HitPoints { get; set; }
}

并且通话就像

var dragon = new MonsterFactory(listOfMonsters).CreateMonster(MonsterType.Dragon);

希望这有帮助