Конструкторы неполных классов
Есть ли способ, чтобы конструктор частичного класса вызывал другой метод, который мой или не может быть определен?
В основном определяется мой неполный конструктор классов:
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
}
}