41 Stimmen

Teilweise Klassenkonstruktoren

Gibt es eine Möglichkeit, den Konstruktor einer partiellen Klasse eine andere Methode aufrufen zu lassen, die definiert sein kann oder auch nicht?

Im Grunde ist mein partieller Klassenkonstruktor definiert:

public partial class Test
{
     public Test()
     {
          //do stuff
     }
}

Ich möchte in der Lage sein, irgendwie zusätzlichen Code einzufügen, der nach dem Aufruf des Klassenkonstruktors ausgeführt wird.

Darüber hinaus gibt es eine Möglichkeit, mehr als eine Datei zu haben, um zusätzlichen Code nach dem Konstruktor aufgerufen wird injizieren?

61voto

LBushkin Punkte 124894

C# unterstützt die Funktion der Teilmethoden . Diese ermöglichen es einer partiellen Klassendefinition, eine Methode weiterzudeklarieren, die ein anderer Teil der partiellen Klasse dann optional definieren kann.

Partielle Methoden haben einige Einschränkungen:

  • sie MÜSSEN vom Typ void sein (keine Rückgabe)
  • sie können KEINE Out-Parameter akzeptieren, wohl aber Ref-Parameter
  • sie dürfen NICHT virtuell oder extern sein und dürfen eine andere Methode nicht überschreiben (über das Schlüsselwort "new")

Partielle Methoden sind implizit versiegelt und privat.

Es ist jedoch nicht möglich, dass zwei verschiedene Teile einer partiellen Klasse dieselbe partielle Methode implementieren. Im Allgemeinen werden partielle Methoden in codegenerierten partiellen Klassen verwendet, um dem nicht generierten Teil die Möglichkeit zu geben, das Verhalten des generierten Teils zu erweitern oder anzupassen (oder manchmal auch andersherum). Wenn eine partielle Methode deklariert, aber in keinem Teil der Klasse implementiert ist, wird der Compiler automatisch alle Aufrufe dieser Methode eliminieren.

Hier ist ein Codebeispiel:

 public partial class PartialTestClass
 {
     partial void DoSomething();

     public PartialTestClass() { DoSomething(); }
 }

 public partial class PartialTestClass
 {
     partial void DoSomething()  { /* code here */ }
 }

9voto

Neil Punkte 6947

Suchen Sie nach "partiellen Methoden". Sie werden genau das tun, was Sie wollen.

Zum Beispiel:

public partial class Test
{
    public Test()
    {
         //do stuff

         DoExtraStuff();
    }

    partial void DoExtraStuff();
}

public partial class Test // in some other file
{
     partial void DoExtraStuff()
     {
         // do more stuff
     }
}

9voto

marc_s Punkte 701497

Nun, in C# 3.0 können Sie so genannte Teilmethoden - Methoden, die aufgerufen werden können, auch wenn sie nicht wirklich vorhanden sind.

Wenn sie nicht in einer der partiellen Klassendateien definiert sind, wird der Aufruf von ihnen durch den .NET-Compiler/Linker entfernt.

So könnten Sie z.B. eine Kundenklasse definieren:

partial class Customer
{
  string name;

  public string Name
  {
    get
    {
      return name;
    }
    set
    {
      OnBeforeUpdateName();
      OnUpdateName();
      name = value;
      OnAfterUpdateName();
    }
  }

  partial void OnBeforeUpdateName();
  partial void OnAfterUpdateName();
  partial void OnUpdateName();
}

Diese partiellen Methoden OnBeforeUpdateName() usw. werden zwar aufgerufen, aber wenn keine der partiellen Klassendateien tatsächlich etwas für sie implementiert, bleibt der Aufruf ohne Wirkung. Linq-to-SQL nutzt dies sehr häufig für diese Art von Benachrichtigungsmethoden.

Siehe diese Blog-Beiträge über partielle Methoden:

Marc

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X