4

アセンブリA(DLL)にオブジェクトのリンクリストがあります(エントリの順序が保持されている限り、他のコレクションタイプに変更できます)。

アセンブリBは、上記のLinkedListを含むクラスからオブジェクトを作成するときに、いくつかの情報を報告するメソッドを割り当てます。メソッドが取る引数の1つは、LinkedListと呼ばれます。

ここで、アセンブリBのこのメソッドがそのLinkedListから読み取れるようにしたい(トラバースしてその内容に基づいて処理を実行できるようにする)が、そのメソッドがリスト内のデータを変更しないようにする必要があります。

私は現在アセンブリAを使用していますが、公開された場合は、ライブラリを使用しているサードパーティがアセンブリ内の結果をいじくり回さないように、アセンブリの外部からデータが変更されないようにする必要があります。

基本的に、私はそのLinkedListをアセンブリAからアセンブリBに移動するパラメーターを「シール」することを検討しています。

私は意味がありますか?

4

5 に答える 5

7
new List<T>(linkedList).AsReadOnly();
于 2012-09-06T17:04:45.863 に答える
4

LinkedList<T>からに変更できる場合List<T>は、 メソッドを使用してAsReadOnly()、リストの読み取り専用ラッパーを作成できます。ラッパーは軽量で、コピーを必要とせず、基になるコレクションへの変更をすぐに反映します。

List<MyClass> originalList = ...
IList<MyClass> readOnly = originalList.AsReadOnly();
于 2012-09-06T17:05:09.660 に答える
2

実際の連結リストを B のコールバック メソッドに渡す代わりに、コピーを渡します。そうすれば、B は元のリストを変更することなく、リストを使って好きなことを行うことができます。

LinkedList(IEnumerable) コンストラクターを使用すると、リンクされたリストのコピーを簡単に作成できます。

var copy = new LinkedList<MyType>(originalList);

明らかに、リストの要素が変更可能であれば、B によって変更できますが、あなたはそれを認識していると確信しています。

于 2012-09-06T16:59:46.470 に答える
2

IEnumerable<T>代わりに戻ることでList<T>問題が解決すると思います。最も簡単な方法:

foreach( var t in list )
    yield t;

このようにして、列挙子のみを返します。消費者はリストの内容を変更できません。

于 2012-09-06T17:02:13.980 に答える
0

コードを投稿できますか。

彼らがデータのコピーを操作できるようにしたいようです。そうすれば、何らかの方法で変更しても、元のコピーは変更されません。

オブジェクトを複製するためのインターフェイスを見て、ICloneableすべての元のコンテンツのコピーを使用して完全に新しいリンク リストを作成し、それをアセンブリ B に戻します。

于 2012-09-06T17:01:01.350 に答える