2016-03-23 2 views
0

これを解決するのにいくつか問題がありましたが、正しい場所を見落としてしまった可能性がありますが、問題があります。個々のプロパティのコレクションと、そのクラスのすべてのプロパティの簡単な列挙もサポートしています。例えばC#エニュメレーションをサポートするクラスを設計する

public class CharacterStats 
{ 
    public List<BaseStat> StatList { get; set; } 

    private BaseStat Level { get; set; } 
    private BaseStat Health { get; set; } 
    private BaseStat Damage { get; set; } 
    private BaseStat Defense { get; set; } 
} 

private void InitializeList() 
{ 
    StatList = new List<BaseStat> 
    { 
     Level, 
     Health, 
     Damage, 
     Defense, 
    }; 
} 

は最終的に、これらのプロパティのそれぞれが独自の権利で重要ですが、そこに私は、これらの特性のすべてをループにしたい特定のケースがあり、それらのそれぞれにチェックを行います。

私はreflectionに精通していますが、そのようにプロパティを反復処理するのは控えめで不要です。私は現在、このプロパティをList<BaseStat>にロールしてそのように設定していますが、これは "正しい"実装であるとはまだ確信していません。

いくつか注意すべき点:

  • 使用状況に応じて、私は(名前で)単一のプロパティへの参照を更新することがあり、OR更新(おそらく列挙を介して)全体のコレクション。
  • コレクション全体を更新すると、これらのプロパティの一部またはすべての修飾子を含むCharacterStats(または同様のもの)タイプの別のオブジェクトが存在する可能性が高くなります。

理想的には、私は必要に応じて、私は簡単に、単一または複数の値を更新することができ、コレクションとして、このクラスを表現するためのソリューションを探しています。

List<T>またはreflectionを使用していますか、または私が考慮していないより良い方法がありますか?私は過去数日間のインタワークスを掘り起こして解決策を見つけようとしましたが、私は(私が信じる)情報は無関係であるか、単に自分自身をさらに混乱させてしまったと知っています。

客観、私がきたように、私はそれに取り組むことができるように、私はこのクラスを設計する方法、(私はreflectionについては、この引数を聞いた)、および使用と可読性の特に容易アカウント潜在的なパフォーマンスの問題を考慮して記載されている?

説明のためにさらに詳しい情報が必要な場合は、ご意見ください。

+0

コードを例に挙げれば、 'List 'がないのはなぜですか?私はそれがとても良い解決策だとは思わないが。 –

+0

クラスIEnumerable のクラスにプロパティを持たせることができ、すべてのプロパティを返すだけですか? – juunas

+0

@DarrenYoungそのコードを残してお詫びしますが、これは私が現在やっていることです。これは機能していますが、私はこのデータを表現するより良い方法があるかどうかを判断しようとしています。私は例にList <>コードを追加しました。 – levelonehuman

答えて

1

動的プロパティを念頭に置いて作成されたExpandoObjectクラスを調べることもできますし、IDictionary<string, object>インターフェイスの実装を通じてこれらの列挙を行うこともできます。あなたのサンプルコードでは、大きな問題を持っている


注:それは、早期(あなたがそれを使用した場合または辞書)リストにプロパティを追加しますが、これらは、実際のオブジェクトのプロパティへの変更と同期して保持されません。あなたが作った1などの一般的な約ある手作りのソリューションを維持したい場合は、私はむしろこれを行うだろう:

public class CharacterStats 
{ 
    public IEnumerable<BaseStat> GetStats() { 
     yield return Level; 
     yield return Health; 
     yield return Damage; 
     yield return Defense; 
    } 

    public BaseStat Level { get; set; } 
    public BaseStat Health { get; set; } 
    public BaseStat Damage { get; set; } 
    public BaseStat Defense { get; set; } 
} 

列挙するようにここでは、プロパティタイプを「通信しません」コンクリート型(LevelStat、HealthStatなどのクラスを持つなど)か、KeyValuePairの列挙型を名前または列挙型のキーとして返すことによってカバーする必要があります。

+0

私のコードに関する問題についてのメモ:私はまだ学んでいることに注意しておくべきですが、私はこれらのプロパティの参照を(オブジェクトであるため)リストに追加しているという印象を受けました。これは当てはまりませんか?これらのプロパティを初期化するコードを投稿していないことにも注意してください。私の実装に関する問題と、それをどのように修正することができるかもしれないかについて私が詳しく説明できますか?私は 'IEnumerable'の考え方が好きです。私はこれを次にしようとするかもしれません。ありがとう! – levelonehuman

+0

@levelonehuman 'InitializeList'メソッドでは、プロパティに格納されている参照をリストにコピーします。プロパティ自体への参照ではありません。したがって、リストは 'InitializeList'が実行されたときのプロパティのスナップショットであり、プロパティ(またはリスト内の項目)へのさらなる変更は他のものに影響を与えません。だから私は列挙コードを提案している。列挙を実行するたびに実行され、列挙が実行されるときにプロパティに格納されている参照を提供します。 – Lucero

+0

これはまさに私が探していたものです!私はまだこれを見るために私のテストコードで十分に得ていなかったと思う - 情報をありがとう。 – levelonehuman

4

Dictionary<String,BaseStat>を使用してください。
dic.Keysまたはdic["Level"]にアクセスできます。

実際にenumをキータイプとして使用すると、入力ミスを防ぐためのボーナスポイントです。

+1

'dic.Values'を繰り返して、キーを調べなくてもすべての値にアクセスできます。 – Floremin

+2

コメントからの回答のコピーには何も問題はありませんが、少なくとも[元のソース]を確認する必要があります(https://stackoverflow.com/questions/36183703/c-sharp-designing-a-class-to-support-enumeration #comment60002919_36183703)。 –

+0

@PeterDuniho:このコメントが書かれたのと同時に私の答えを書いた。 – ths

関連する問題