|
Hallo!
Ich habe eine Collection geschrieben, die von
CollectionBase erbt. Dabei wollte ich zwei Dinge erreichen:
1.) Alle Funktionen aus IList, die die Collection
ver�ndern (set-property, Add, Remove, RemoveAt, Insert und Clear) sollen nur
Assembly intern verwendet werden, so dass die Collection au�erhalb der Assembly
nicht ver�ndert werden kann
2.) Die Funktionen sollen Typ-sicher sein, d.h.
statt object soll z.B. MeinDatenTyp als Funktionsargument verwendet
werden.
Ich benutze folgende implementierung:
[code]
public class
ValidDeviceCollection
: CollectionBase, IList // Notwendig f�r explizite implementation { #region Explicit implementation of IList to prevent modificaition void
IList.Clear()
{ throw new System.NotImplementedException(); } void IList.Insert(int in_index,
object in_value)
{ throw new System.NotImplementedException(); } void IList.Remove(object
in_value)
{ throw new System.NotImplementedException(); } void IList.RemoveAt(int in_index) { throw new System.NotImplementedException(); } int IList.Add(object
in_value)
{ throw new System.NotImplementedException(); } object IList.this[int
in_index]
{ // lesen
erlauben
get { return List[in_index]; } //
schreiben verbieten
set { throw new NotImplementedException(); } } #endregion
#region Implementation of
IList
public IValidDevice this[int
index]
{ get { return (IValidDevice)List[index]; } // auf
einen set-accessor muss ich hier
//
verzichten
} public bool
Contains(IValidDevice in_value)
{ return List.Contains(in_value); } public int IndexOf(IValidDevice in_value) { return List.IndexOf(in_value); } public bool
IsFixed
{ get { return true; } } public bool
IsReadOnly
{ get { return true; } } // nur
assembly-intern
internal void Insert(int
in_index, IValidDevice in_value)
{ List.Insert(in_index, in_value); } // nur
assembly-intern
internal void
Remove(IValidDevice in_value)
{ List.Remove(in_value); } // nur
assembly-intern
internal void RemoveAt(int
in_index)
{ List.RemoveAt(in_index); } // nur
assembly-intern
internal int Add(IValidDevice
in_value)
{ return List.Add(in_value); } // nur
assembly-intern
internal void
Clear()
{
List.Clear();
}
#endregion } [/code]
Ist das soweit OK, oder sieht jemand ein
Schlupfloch, wie man doch noch von au�en die Collection ver�ndern
kann?
MfG Andre
P.S.: Entschuldigung, falls dieser Beitrag zweimal erscheint, ich habe ihn
einmal unter einer falschen Mail-Adresse verschickt. Christoph, verzeih mir
:) |
- [Csharp.net] Re: [Csharp.net] CollectionBase: ?nder... Andre \(VizOne\) Loker
- [Csharp.net] Re: [Csharp.net] CollectionBase: ... Andre \(VizOne\) Loker
