2012-04-05 6 views
1

Gibt es eine Möglichkeit, eine vorhandene Methode in einer partiellen Klasse zu überschreiben?Codegenerierungsproblem, überschreiben vorhandene Methodenimplementierung

So etwas (ich weiß, das ist nicht kompilieren)

/// <summary> 
/// Generated Code for MyClass 
/// </summary> 
public partial class MyClass 
{ 
    public void MyMethod() 
    { 
     //Do work specific to MyClass 
    } 
} 

/// <summary> 
/// Non-generated extension for MyClass 
/// </summary> 
public partial class MyClass 
{ 
    public override void MyMethod() 
    { 
     //Do some other work 
    } 
} 

ich in diese Notwendigkeit leite, während einige Code-Generierung zu tun. Ich erzeuge Teilklassen von meinem EDMX und Methoden für diese Klassen, wo 90% meiner Klassen Methoden haben, die für ihre Eigenschaften spezifisch sind.

Aber ich renne in Fälle, in denen ich die einmaligen Methoden mögen würde.

Gibt es so etwas, das ich übersehe? Oder einige vorgeschlagene Alternativen?

Antwort

1

Sie können eine partielle Methode dafür verwenden. Ich nehme an, Sie können hier extrapolieren, wenn Sie Änderungen an der Signatur vornehmen müssen usw.

Es ist auch erwähnenswert, dass wenn Sie eine partielle Methode definieren und niemand eine Implementierung für sie in einem anderen Teilbit der Klasse definiert in einen No-Op, kein Fehler, so dass Sie sich keine Sorgen machen müssen, dass es Probleme verursacht. Es wurde buchstäblich nur für diesen Anwendungsfall gebaut.

+0

Sehr nützlich! Irgendwelche Ideen für Zeiten, in denen ich nicht möchte, dass der Code vor 'MyMethodImpl();' ausgeführt wird? – Khan

+0

Wann soll es nicht ausgeführt werden? Soll MyMethod übersprungen werden, wenn MyMethodImpl definiert ist? Sie könnten MyMethodImpl einen booleschen Wert zurückgeben, der in den Dokumenten als "automatisch generierten Code ausführen" definiert ist. – Servy

+0

Tatsächlich müssen partielle Methoden ungültig sein, also müssten Sie eine boolesche Variable für eine Instanz festlegen oder einen out-Parameter verwenden. – Servy

0

Warum von den generierten Klassen- und Override-Methoden in der abgeleiteten Klasse abgeleitet werden?

+0

Sie können unter Problemen mit der Sprödigkeit der Basisklasse leiden. Automatisch generierte Klassen neigen dazu, sich ziemlich zu ändern, und es gibt keine Person, die sich alle Änderungen ansehen kann, um sicherzustellen, dass sie die Funktionalität der abgeleiteten Klasse nicht beeinträchtigt. – Servy

+0

Ich bin nicht davon überzeugt, dass andere technische Weblösungen wie Teilmethoden Ihnen bei diesem Problem helfen. Wenn Sie manuelle Code- und Code-Generatoren haben, die sich im Laufe der Zeit ändern, brauchen Sie einen Menschen, der weiß, ob sich die Dinge verhaltensmäßig vermischen.Wir verwenden das Muster, das wir für dieses Problem doppelt abgeleitet nennen. – GarethJ

1

Wir verwenden das doppelt abgeleitete Muster mit gekennzeichneten Erweiterungspunkten ausgiebig in unserer Codebasis. http://msdn.microsoft.com/en-us/library/bb126289(v=vs.100).aspx

generiert Code sieht wie folgt aus:

public abstract class FooBase 
{ 
    protected FooBase() 
    { 
    } 
    public virtual int GetSomeThing() 
    { 
     // ... some generated implementation ... 
    } 
} 

public partial class Foo 
{ 
    public Foo() : FooBase() 
    { 
    } 
    // Nothing except the constructor generated in this class. 
} 

Wir werden dann gelegentlich generierten Methoden kennzeichnen ihre Notwendigkeit manueller Code von Methoden erzeugen, die mit einem großen Kommentar nicht kompilieren, eine Stub-Implementierung bietet für der manuelle Code, der benötigt wird. Es war ziemlich erfolgreich.

Verwandte Themen