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 :)

Antwort per Email an