Конструкторы неполных классов

Есть ли способ, чтобы конструктор частичного класса вызывал другой метод, который мой или не может быть определен?

В основном определяется мой неполный конструктор классов:

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

Я хотел бы иметь возможность как-то вставить дополнительный код для запуска после вызова конструктора классов.

Кроме того, есть ли способ иметь несколько файлов для ввода дополнительного кода после вызова конструктора?

Ответ 1

С# поддерживает функцию частичных методов. Это позволяет частичное определение класса для пересылки объявить метод, который может затем опционально определить другую часть частичного класса.

Частичные методы имеют некоторые ограничения:

  • они ДОЛЖНЫ быть типа void (без возврата)
  • они НЕ МОГУТ принять параметры, однако они могут принимать параметры ref
  • они НЕ МОГУТ быть виртуальными или внешними и НЕ МОЖЕТ переопределять или перезаписывать другой метод (через "новое" ключевое слово)

Частичные методы неявно закрыты и закрыты.

Однако не возможно, чтобы две разные части частичного класса реализовали один и тот же частичный метод. Обычно частичные методы используются в генерируемых кодом частичных классах как способ разрешить негенерированную часть расширения или настроить поведение части, которая генерируется (или иногда наоборот). Если частичный метод объявлен, но не реализован в какой-либо части класса, компилятор автоматически устранит любые вызовы.

Вот пример кода:

 public partial class PartialTestClass
 {
     partial void DoSomething();

     public PartialTestClass() { DoSomething(); }
 }

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

Ответ 2

Ну, в С# 3.0 вы можете получить так называемые partial methods - метод, который можно вызвать, даже если они на самом деле не существуют.

Если они не определены ни в одном из файлов частичного класса, вызов для них будет удален компилятором/компоновщиком .NET.

Итак, вы можете определить, например. класс Customer:

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();
}

Те частичные методы OnBeforeUpdateName() и т.д. будут вызываться, но если ваш ни один из файлов частичного класса фактически ничего не реализует для них, этот вызов будет безрезультатным. Linq-to-SQL использует это большое время для таких методов уведомления.

Смотрите эти сообщения в блоге по частичным методам:

Марк

Ответ 3

Найдите "частичные методы". Они будут делать именно то, что вы хотите.

Например:

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
     }
}