どのように管理すればよい状態で保管する必要が複数の関係のない種類のものを特定の種類のでしょうか?
質問
ように編集者にファイルに使用されている重要な社内検査ツールを活用しています。ツール自体が大きく、複雑なリファクタリング又は書き換えうるものより多くのリソーしに努めるとともにするものとし、また、これにforseeable将来、自分の手をつない大きます。っていれば使用。純ます。
ダウンロードファイルは、XML直列化されたバージョンのクラスが使用するツール(ここではA,B,C,D)。授業形成のツリー構造が正することができます。当社の編集者による作品の積み込み設定ファイルdeserializingし、作業の関係、および身体の安全を確保するための他の悪い国です。については、"移動から手を編集これらのファイルを紹介するトンに誤差は生じません。
特定のタイプのエラーは、いままでの維持を集ファイルを全ての問題です。全ての授業では問題のていただきたいと思いますように重複を減らのコードでいくことです。重要な要件は、ユーザーニーズを手に入れることができる項目セット例えば、必要なすべて取得し、オブジェクトエラーには伝えに対して繰り返し処理を実行する全体のコレクションとピうしたいのは、容認できないと比較して GetAs()
方法。まとめると、第一に考えた汎用のアイテム関連の直列化復元オブジェクトとそのメタデータを示すこと、エラー:
public class ErrorItem<T>
{
public T Item { get; set; }
public Metadata Metadata { get; set; }
}
そして、思いを集めるクラスがすべてのエラー項目は、介助の方法の項目の特定のクラスの場合、ユーザーニーズをカタチにします。ここでのトラブルが始まります。
の授業を受け継ぐと共通の先祖からその他の Object
).これが間違いのは初期デザイン、がん過ごした数日を考えるので、授業のねしているものがいっぱいあって共通の他こと財産を一意に識別する各項目では見えなぜ、オリジナルデザイナーな関係を通じて継承関係を示します。このことは統一的なエラーの集いく必要がある ErrorItem<Object>
物からないの基底クラスまたはインターフェースを制限するには何が入れるようにしたいでしょう。しかし、この統一コレクションの中に、少し依頼くれた。
Public Class ErrorCollection
{
public ErrorItem<Object> AllItems { get; set; }
}
しかし、この結果は、インターフェース。何かしていけるのではないかと思い返し、適切な ErrorItem
汎用タイプのようになります:
public ErrorItem<A>[] GetA()
このなかで店 ErrorItem<Object>
!私はそれが回避策の私の頭主な新規作成 ErrorItem
の適切なタイプon-the-flyで気持ちのような醜い.別の考えを使用されている Dictionary
い項目を編成型されているが、それでもなさそうです。
あのようなパターンがあった。知っている最も簡単な方法で解決するに当たるので、これまでベースクラスA、B、C、Dから、私はいいとして小さな影響を及ぼす独自のツールとして可能です。の費用の回避策も十分でおいしい食べ物が押しするツールなのでしょうか?
解決
場合はA,B,C,Dにおいても共通しを基底クラスなんだものです。これまで空のクラスには、効果と新しいパスワードを入力してくオブジェクトです。
いを作成しErrorItemクラスのジェネリック医薬品は、項目オブジェクトは、いくつかの鋳造時に使いたい物をされます。を利用する場合は、プロパティやメソッドは、A、B、C、Dクラス以外のことですが、それを鋳型で固めてくれました。
他のヒント
これをお探しですか?
private List<ErrorItem<object>> _allObjects = new List<ErrorItem<object>>();
public IEnumerable<ErrorItem<A>> ItemsOfA
{
get
{
foreach (ErrorItem<object> obj in _allObjects)
{
if (obj.Item is A)
yield return new ErrorItem<A>((A)obj.Item, obj.MetaData);
}
}
}
したい場合はキャッシュの ItemsOfA
簡単なる:
private List<ErrorItem<A>> _itemsOfA = null;
public IEnumerable<ErrorItem<A>> ItemsOfACached
{
if (_itemsOfA == null)
_itemsOfA = new List<ErrorItem<A>>(ItemsOfA);
return _itemsOfA;
}
その答えっとこれまでに組み合わせの回答からfryguybobとMendelt Siebenga.
を追加する基底クラスだけが汚染さの名前空間を導入する同様の問題としてMendelt Siebengaを指摘しなければなりません。そこで私はさらに制御どの項目では、コレクションのいく必要がある ErrorItem<BaseClass>
やまだいくつかの鋳物なって若干異なる問題は同じルートである。そのため、選択した後に答え:ここでいっていいかぶどうやKISSいじるような基底クラスとジェネリックこなすのもよしですね!
いfryguybobの回答の解決策自体が思って yield return
, しながら、非キャッシュ版やすく書けっ利用LINQ).と思い、キャッシュされたバージョンがエクスペディアのキャンセルワイスが、期待通りの性能パラメータでは非キャッシュ版noticably遅くなります。