5

言語に慣れるために、C# で簡単なロールプレイング ゲームを作成しようとしています。

CSV ファイルからデータを読み込み、オブジェクトを作成し、辞書に配置するクラスがあります。ゲームのすべての側面には異なるデータ (アイテム、俳優、スキルなど) があるため、これらをそれぞれクラスとして設定しましたが、それぞれに対して Load() メソッドを再実装する必要があります。これを 5 ~ 6 回実行した後、これを実装するためのより良い方法がないかどうか疑問に思っています。

基本的に、私がやりたいことは、ヘッダーを含む CSV の最初の行を解析し、これらをクラス変数名として使用することです。現在、それらは辞書関係として実装されているため、ファイルの内容から完全に生成される SomeClassInstance.id を理想的に入力する SomeClassInstance.dict["id"] を実行します。

それは事ですか?どうすればいいですか?

4

4 に答える 4

7

シリアライゼーションについて読む必要があります。ファイルを CSV ファイルに保持する代わりに、シリアライズされた形式で保存し、必要なタイプに直接ロードできます。

シリアル化と逆シリアル化に必要なメソッドは 2 つだけです。

以下を読むことをお勧めします。

上記のリンクはさまざまなシリアライザーへのものです (そして、私は確かに一部を省略しました - 知っている人なら誰でも、あなたが知っている良いシリアライザーがあれば、追加してください) - 読んで、それらの 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;
    }
}

このファクトリは、与えられたディクショナリのオブジェクト インスタンスを作成します。つまり、さまざまな種類のオブジェクトをすべて作成するメソッドは 1 つだけです。次のように使用します。

   // 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

Derive from DynamicObject and override TryGetMember so that it returns the appropriate dictionary entry. Exactly what Microsoft did in MVC 3's ViewBag. Example usage (if your derived type was named 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 に答える