2009-10-16 2 views
28

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

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

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

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

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

ответ

49

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

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

  • они должны быть пустоты типа (без возврата)
  • они не могут принять из параметров, однако они могут принимать параметры исх
  • они не могут быть виртуальными или ехЬегп и НЕ МОЖЕТ переопределить или перезаписать другой метод (с помощью «нового» ключевого слова)

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

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

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

public partial class PartialTestClass 
{ 
    partial void DoSomething(); 

    public PartialTestClass() { DoSomething(); } 
} 

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

Фактически они могут принимать параметры ref. Они не соглашаются. –

+1

Да, спасибо, Мирча, только что исправил это. – LBushkin

+4

К сожалению, вы не можете присваивать значения полям 'readonly' из этих частичных методов, поэтому технически нет частичных конструкторов, даже если вы решили только вызвать их из конструктора. –

5

Поиск «частичных методов». Они будут делать именно то, что вы хотите.

Например:

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

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

Если они не определены ни в одном из файлов частичного класса, вызов для них будет удален компилятором/компоновщиком .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 использует это большое время для таких методов уведомления.

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

MARC

+1

«потомок класс»: причина использовать частичный метод заключается в его реализован в * же * классе, а другой частичный файл. Если он не реализован в одном классе, он удаляется компилятором. – itowlson

+0

Возможно ли, чтобы несколько частичных классов объявили этот метод, или он может быть объявлен только max один раз? – Omar

+0

@itowlson: конечно, извините, получил частичные методы и наследование смешалось :-) –

Смежные вопросы