2009-08-14 14 views
2

Ich muss oft eine Schnittstelle implementieren, indem ich die Implementierung an ein Mitglied meiner Klasse delegiere. Diese Aufgabe ist sehr mühsam, da Visual Studio zwar Stubs für die Interface-Methoden generiert, ich aber den Code schreiben muss, um die Implementierung zu delegieren. Es braucht nicht viel zu denken, also könnte es wahrscheinlich durch ein Code-Generierungstool automatisiert werden ...Tool zum Generieren der Schnittstellenimplementierung durch Delegierung?

Ich bin wahrscheinlich nicht der erste, der darüber nachdenkt, also muss es schon ein solches Werkzeug geben, aber ich konnte bei Google nichts finden ... Irgendeine Idee?


EDIT: es scheint, dass ReSharper can do it, aber es ist ziemlich teuer ... gibt es eine kostenlose Alternative mit der gleichen Funktion?

+0

Ah der Extrakt Dekorateur. Ich wollte das schon lange in Coderush machen - habe nie Zeit gefunden. Ich würde mich für die Antworten interessieren. –

Antwort

2

Ich benutze Resharper jetzt seit ein paar Monaten, und es hat eine großartige Funktion, dies zu tun.

Zum Beispiel schreiben Sie folgenden Code:

class MyList<T> : IList<T> 
{ 
    private readonly IList<T> _list; 
} 

Platz der caret auf _list, drücken Alt + Ins (Abkürzung Code generieren) und wählen Sie "Delegieren Mitglieder". Wählen Sie die Mitglieder, die Sie benötigen, und R # erzeugt delegierende Mitglieder für sie:

public void Add(T item) 
    { 
     _list.Add(item); 
    } 

    public void Clear() 
    { 
     _list.Clear(); 
    } 

    public bool Contains(T item) 
    { 
     return _list.Contains(item); 
    } 

    public void CopyTo(T[] array, int arrayIndex) 
    { 
     _list.CopyTo(array, arrayIndex); 
    } 

    public bool Remove(T item) 
    { 
     return _list.Remove(item); 
    } 

    public int Count 
    { 
     get { return _list.Count; } 
    } 

    public bool IsReadOnly 
    { 
     get { return _list.IsReadOnly; } 
    } 

    public int IndexOf(T item) 
    { 
     return _list.IndexOf(item); 
    } 

    public void Insert(int index, T item) 
    { 
     _list.Insert(index, item); 
    } 

    public void RemoveAt(int index) 
    { 
     _list.RemoveAt(index); 
    } 

    public T this[int index] 
    { 
     get { return _list[index]; } 
     set { _list[index] = value; } 
    } 
0

... siehe dynamische Proxy ...

jedoch ...

Die Möglichkeit, Interface-Implementierung zu einer Instanzvariablen zu delegieren oder geben Sie [wie in typeof (type)], ist eine dringend benötigte Sprachfunktion von C# und VB.Net. Mit der Abwesenheit von Mehrfachvererbung und der Vorherrschaft versiegelter und nicht-virtueller Methoden und Eigenschaften ist die Menge an erforderlichem Fluff-Code entmutigend.

Ich würde denken, die folgende Sprachverbesserung funktionieren würde ... // C#

interface IY_1 
{ 
    int Y1; 
    int Y2; 
} 
... 
.. 
interface IY_n 
{ 
.... 
.. 
} 


class Y : IY_1, IY_2, ....,IY_n 
{ 
    private readonly Oy_1 Oy_1 = new Oy_1() supports IY_1, IY_2,...etc; // <<----- 
    private readonly Oy_2 Oy_2 = new Oy_2() supports IY_3, IY_8,...etc; 
    public int Y2 {...} 
} 

Die „Träger“ Schlüsselwort (oder gleichwertig wie „defaults“) eine geordnete Liste von Klassenfeldwerte würden identifizieren Diese "assistieren" bei der Implementierung einer oder mehrerer Schnittstellen unter Verwendung der normalen Namen- und Signaturzuordnungssemantik der Schnittstelle von Namens- und Signaturkorrespondenz. Jede lokale Implementierung hätte Vorrang und auch eine einzige Schnittstelle könnte durch mehrere Feldwerte implementiert werden.

+0

Ich stimme zu, dass es ein interessantes Feature wäre ... aber ich bin nicht sicher, MS würde es als nützlich genug betrachten, um es zu machen Sprache –

Verwandte Themen