Как использовать частичный метод в C # для расширения существующей реализации

Было бы здорово, если бы это сработало. Я пытаюсь неправильно реализовать свою идею?

Я хотел бы использовать частичный метод, чтобы иметь возможность расширять существующий код и просто включать / отключать реализацию методов.

По сути, именно это ссылка заявляя:

Частичные методы позволяют разработчикам классов предоставлять перехватчики методов, аналогичные обработчикам событий, которые разработчики могут решить реализовать или нет. Если разработчик не предоставляет реализацию, компилятор удаляет подпись во время компиляции.

Моя первая попытка использовать это следующее:

DefinitionsBase.cs:

namespace ABC {
    public partial class Definitions {
        // No implementation
        static partial void TestImplementaion();
    }
}

DefinitionsExt.cs:

namespace ABC {
    public partial class Definitions {
        static partial void TestImplementaion(){
            // Implementation is here
        }
    }
}

Program.cs:

namespace ABC {
    class Program {
        static void Main(string[] args) {
            Definitions.TestImplementaion();
        }
    }
}

Это то же пространство имен, но, как указано в ссылке, частичные методы неявно являются частными. Он не принимает модификаторы доступа, и я не могу вызвать его из своего класса. Есть ли способ использовать его так, как я собираюсь?

Спасибо!


person DDan    schedule 22.09.2015    source источник
comment
Зачем ты это делаешь? Вы используете какой-нибудь собственный генератор кода?   -  person Luaan    schedule 22.09.2015
comment
Да, я создаю разные реализации в зависимости от требований, и я хочу иметь возможность просто вставлять / удалять изменения, сохраняя общий базовый код без изменений.   -  person DDan    schedule 22.09.2015
comment
Вы уверены, что статические частичные методы - лучший способ сделать это? Почему бы, например, просто не использовать абстрактные классы или интерфейсы?   -  person Luaan    schedule 22.09.2015
comment
Вы правы, @Luaan. Определенно лучше использовать абстрактные классы и интерфейсы, а методы переопределения иметь отдельные реализации. Я так и делаю. Это больше похоже на исправления, подобные патчу, и быстрые решения, просто добавляя файл расширения и не изменяя какой-либо существующий код, вы получаете альтернативную реализацию метода.   -  person DDan    schedule 22.09.2015


Ответы (1)


Вы можете использовать общедоступный метод, который вызывает частный метод, но я не уверен, что вы этого хотите. Это просто заставляет ваш код работать.

Частичные методы по определению являются частными, так как во время компиляции, если метод не был реализован, компилятору не нужно просматривать весь код, находить все возможные ссылки на метод и удалять их. Это выбор дизайна, поскольку частичные методы не обязательно должны быть реализованы, компилятор просматривает только частичную реализацию класса, а не весь код. Если вы реализуете общедоступный метод, который вызывает частичный метод, а частичный метод не был реализован, компилятор по-прежнему будет просматривать только файлы и код частичного класса, даже если у вас есть доступ к этому частичному методу из любого места вашего кода.

person John Demetriou    schedule 22.09.2015
comment
Да, это мой план Б. Спасибо, что разместили его! Это решение в данном случае? - person DDan; 22.09.2015
comment
@DDan: Да, в основном. - person Jon Skeet; 22.09.2015
comment
@DDan Учитывая, что частичные методы не могут быть общедоступными, альтернативы нет - person John Demetriou; 22.09.2015
comment
Спасибо за помощь, ребята. Это оправдывает меня, чтобы пойти дальше по этому пути. Это развеивает мои сомнения. - person DDan; 22.09.2015