2017-06-28 5 views
0

これまで私はこの質問をしていましたが、回答があると思っていましたが、残念ながら答えは必要ではありませんので、取得するため。ここでC#クラスインスタンス間でデータを保持する方法

は私の前の質問へのリンクです:クラスAはリストが含まれている場合、どのように私はその中のデータを保存することができます

与えられたクラス

:ここC# how can I preserve data between class instances?

は、問題の説明ですオブジェクトBとC(クラスAのインスタンス)がリスト内のデータにアクセスできるようにします(たとえBとCの両方がクラスAの独自のインスタンスを新しくしたとしても)。

**これは、オブジェクトデータソースを使用して実装しようとしているレポートソリューションのためのものです。

私は次のコードは、上記のコードの問題は、私はインスタンスと静的リストを更新するたびに、それは前の呼び出しからのデータを上書きするということです

[DataObject] 
public class Product 
{ 
    public string Name {get; set;} 
    public string Category {get; set;} 
    public int ID {get; set;} 

    // this method let's calling code add an instance of this class to the 
    // to the ProductList 
    public void AddItemsToList() 
    { 
     ProductList.Add(this); 
    } 

    // static list allows me to preserve the list data 
    public static List<Product> ProductList = 
     new List<Product>(); 

    // This method is used to return an IEnumberable object to my reporting 
    // solution (Telerik Reports) 
    [DataObjectMethod(DataObjectMethodType.Select)] 
    public IEnumerable<Product> GenerateReport() 
    { 
     return ProductList; 
    } 

} 

私の問題への解決策だと思いましたList.Add()に追加します。したがって、この商品クラスのインスタンスを5つ追加すると(それぞれ異なるプロパティ値が設定されています)、私のリストには、すべてのプロパティー値が最後に設定された5つのアイテムがすべて含まれます。

必要なもの:自分のデータを保持するだけでなく、リストに最後のインスタンスを5コピーだけ追加するのではなく、各インスタンスのコピーがリストに含まれていることを確認する必要があります。

必要に応じて詳細を提供し、必要に応じてテストコードを提供することができます。どんなアイデアであれ非常に役に立ちます。

+0

実際に* 5つの異なるアイテムを追加した場合、5つの異なるアイテムがあります。リストに同じアイテムのコピーが5つある場合は、同じアイテムのコピーを5つ追加したためです。それはすべてが本当に悪い考えのように思える。このような静的リストを持つべきではありません。どのようなコードでも、これらのアイテムのリストが必要な場合は、そのリストを持ち、必要に応じてアイテムを追加する必要があります。 – Servy

+0

右...それは理にかなっています。ちょうど私がAddItemToListを複数回呼び出すと、クラスの新しいインスタンスをリストに追加するという意味ではありません(私はちょうど更新されたプロパティで同じインスタンスを追加しています)。私は新しいインスタンスで私の呼び出しコードを送信し、それが動作するかどうかを確認します。 –

+1

あなたの質問にクラス 'A'、' B'、 'C'が含まれている場合、なぜあなたのコード例はそれを示していませんか?率直に言えば、その質問は全く明らかではありません。私はここでシングルトンが助けになるとは思っていません。しかし、あなたが試したことと、それがうまくいかなかった理由を、よりよく説明する必要があります。 'B'と' C'クラスがそれぞれ 'A'のインスタンスを持っている理由を説明してください。何らかの理由で、' A'の_other_インスタンスが所有するリストオブジェクトにアクセスする必要があります。より具体的で質問をより明確かつ分かりやすい方法で提示できるようになるまで、皆さんが得ようとしているのは行き止まりの答えです。 –

答えて

0

同じインスタンスをリストに追加するため、すべてのインスタンスで同じプロパティ値が得られます。リストには5つのエントリがあり、すべてが同じオブジェクトを指しています。

これを修正するには、実際の現在のインスタンスを追加する代わりに、ProductListの現在のインスタンスを複製(または正しいプロパティ値で新しいインスタンスを作成)し、リストに追加することができます。そうすれば、リスト内の各エントリは別のオブジェクトを指し示し、現在のオブジェクトを更新してもそれらのオブジェクトには影響しません。

+0

ありがとうございます。それは今働いているようだ。今私は、オブジェクトデータソースを使用して実装しようとしているレポートソリューションに関連しているので、争うべき他の問題があります。 –

+0

私は答えとしてServyのコメントに印を付けることができないので、これは本当に問題と解決策であるため、答えとしてマークします。そのインスタンスの正しいプロパティを持つクラスの新しいインスタンスをリストに追加しました。 –

0

シングルトンパターンを使用する必要があります。したがって、クラスAのインスタンスは1つしかなく、アプリケーションのどこからでもアクセスできます。クラスAのデータは共有され、クラスBおよびCおよび他のクラスからアクセスできます。

+0

残念ながら、以前はシングルトンのパターンを実装したことはありませんでした。うまくいけば、学習するのは楽しい時間になると思うので、学習するのは難しくありません。私はそれを徹底的に調べます。ありがとう。 –

+0

それは非常に簡単です、あなたはプライベートとしてあなたのコンストラクタをマークし、クラスの定義済みのインスタンスを取得するプロパティを作成します。 このリンクを確認することができます https://msdn.microsoft.com/en-us/library/ff650316.aspx –

0

シングルトンパターンの後ろにいるようです。 John Skeetは、C#のSingletonのさまざまな実装について素敵なarticleを持っています。あなたのニーズに合ったものを選ぶことができます。

+0

ありがとう私は見てみましょう。 –

関連する問題