5

我正在尝试用 C# 编写一个简单的角色扮演游戏,以更加熟悉该语言。

我有一个从 CSV 文件加载数据、创建对象并将其放入字典的类。因为游戏的每个方面都有不同的数据(项目、演员、技能等),所以我将这些数据设置为一个类,但这需要我为每个数据重新实现一个 Load() 方法。在这样做了 5 或 6 次之后,我想知道是否有更好的方法来实现它。

基本上,我想要做的是解析包含标题的 CSV 的第一行,并将它们用作类变量名。目前,它们是作为字典关系实现的,所以我会使用 SomeClassInstance.dict["id"],我最好在其中键入 SomeClassInstance.id,它完全由文件的内容生成。

那是一回事吗?我该怎么做呢?

4

4 回答 4

7

您需要阅读序列化- 您可以将它们存储为序列化格式并将它们直接加载到所需的类型中,而不是将文件保存在 CSV 文件中。

您只需要几个方法来序列化和反序列化。

我建议阅读:

上面的链接指向不同的序列化程序(我当然遗漏了一些 - 任何知道的人,如果你知道有一个好的序列化程序,请添加) - 通读,查看他们的 API,与他们一起玩,看看他们的-磁盘格式并做出决定。

于 2012-08-09T20:26:56.887 回答
7

如果您坚持当前的设计(CSV + 字典),您可以使用 ExpandoObject 类来获取您要查找的内容,创建一个简单的工厂类:

public static class ObjectFactory
{
    public static dynamic CreateInstance(Dictionary<string, string> objectFromFile)
    {
        dynamic instance = new ExpandoObject();

        var instanceDict = (IDictionary<string, object>)instance;

        foreach (var pair in objectFromFile)
        {
            instanceDict.Add(pair.Key, pair.Value);
        }

        return instance;
    }
}

该工厂将创建您提供给它的任何字典的对象实例,即创建所有不同类型对象的一种方法。像这样使用它:

   // Simulating load of dictionary from file
   var actorFromFile = new Dictionary<string, string>();

   actorFromFile.Add("Id", "1");
   actorFromFile.Add("Age", "37");
   actorFromFile.Add("Name", "Angelina Jolie");

   // Instantiate dynamically
   dynamic actor = ObjectFactory.CreateInstance(actorFromFile);

   // Test using properties
   Console.WriteLine("Actor.Id = " + actor.Id + 
                     " Name = " + actor.Name + 
                     " Age = " + actor.Age);
   Console.ReadLine();

希望这会有所帮助。(是的,她出生于 1975 年)

于 2012-08-09T22:28:11.830 回答
1

从DynamicObject派生并覆盖TryGetMember,以便它返回适当的字典条目。正是微软在 MVC 3 的 ViewBag 中所做的。示例用法(如果您的派生类型名为CsvBag):

dynamic bag = new CsvBag(csvFileStream);
_monitor.Monster.LookUp(*bag.Id*).Attack(player); // whatever.. 
于 2012-08-09T20:31:30.487 回答
0

为什么不创建一个负责读取数据并返回指定对象实例的管理器对象呢?就像是:

var actors = ActorsLoader.Load("actors.cvs");

其中 ActorsLoader.Load 可以实现为:

IEnumerable<Actor> Load( string fileName )
{
    //1. reading each line (each line = new actor) & creating actor object
    //2. adding created actor object to a collection
    //3. returning back a collection
}

我假设每种类型的游戏内对象都存储在单独的文件中(所以你有:actors.csv、items.csv、skills.csv 等)

于 2012-08-09T20:36:42.030 回答