Kyl*_*ran 5 c# csv design-patterns dynamic
我正在尝试用C#编写一个简单的角色扮演游戏,以便更熟悉该语言.
我有一个类从CSV文件加载数据,创建一个对象,并将其放在字典中.因为游戏的每个方面都有不同的数据(项目,演员,技能等),所以我将每个方面都设置为一个类,但这需要我为每个方面重新实现一个Load()方法.在做了5到6次之后,我想知道是否有更好的方法来实现它.
基本上,我想要做的是解析包含标题的CSV的第一行,并将它们用作类变量名.目前,它们是作为字典关系实现的,所以我会做SomeClassInstance.dict ["id"],理想情况下我会输入SomeClassInstance.id,它完全是根据文件的内容生成的.
那是一件事吗?我该怎么做呢?
您需要阅读序列化 - 而不是将文件保存在CSV文件中,您可以将它们以序列化格式存储并直接加载到所需类型中.
您只需要几种方法来序列化和反序列化.
我建议阅读:
上面的链接是针对不同的序列化器(我确实留下了一些 - 知道的任何人,如果你知道有一个好的序列化器,请添加) - 通读,查看他们的API,玩它们并看到他们的-disk格式并做出决定.
如果你坚持使用当前的设计(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;
}
}
Run Code Online (Sandbox Code Playgroud)
这个工厂将创建你给它的任何字典的对象实例,即只创建一个方法来创建所有不同类型的对象.像这样使用它:
// 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();
Run Code Online (Sandbox Code Playgroud)
希望这会有所帮助.(是的,她出生于1975年)