Как сохранить настройки существующих методов в автоматически сгенерированном частичном классе C #? - PullRequest
0 голосов
/ 15 июля 2011

Я работаю с закодированными тестами пользовательского интерфейса Visual Studio и хочу сохранить изменения в сгенерированном коде.

Код генерируется как частичный класс в UIMap.cs и UIMap.Designer.cs, и поэтому я знаю, что одним из решений будет создание метода с немного другим именем, например myMethod_persist в UIMap.csи используйте это вместо myMethod в UIMap.Designer.cs, которое будет перезаписываться при каждой регенерации источника.

Это, однако, кажется очень грязным, и поэтому я бы предпочел вместо этого переопределить myMethod в UIMap.cs.Таким образом, интерфейс не сложен с большим количеством gumph, и я не должен помнить, чтобы изменить каждый экземпляр myMethod в вызывающем коде на myMethod_persist

К сожалению, когда дело доходит до C #, янемного новичка, и даже не знаю, возможно ли это.

В основном я хочу вот что:

[UIMap.Designer.cs]
partial class myClass
{
    public override void myMethod( int a ){ somethingHorrible(int a); };
}

[UIMap.cs]
partial class myClass
{
    public sealed override void myMethod( int a ){ somethingNice(int a); };
}

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

Ответы [ 2 ]

1 голос
/ 15 июля 2011

Здесь только один класс - myClass. Ключевое слово part позволяет разделить определение класса на несколько файлов.

Вы можете использовать частичные методы, но только если оригинальный (сгенерированный) метод использует частичное ключевое слово. Вы не можете переопределить метод в том же классе.

См. Частичные классы и методы (Руководство по программированию в C #) .

0 голосов
/ 15 июля 2011

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

Производный класс (наследующий автоматически сгенерированный класс) сможет использовать переопределение или новый в объявлениях методов, которые вы хотите заменить. Однако есть много предостережений в отношении этого подхода. Вы можете только «переопределить» метод, который был удален как виртуальный в базовом классе (или сам по себе был переопределением другой базовой виртуальной базы и т. Д.). Вы также можете заменить метод на «новый» в производном классе, но другой код в базовом классе не будет знать о вашей «новой» версии и не будет вызывать его (тогда как они будут вызывать ваше «переопределение», потому что они знать способ быть виртуальным). Есть также проблемы доступности; ваш производный класс не будет иметь доступа к закрытым членам базового класса.

Но для некоторых вещей, которые вы хотите сделать, это может сработать. В некоторых случаях вам, возможно, придется немного изменить автоматически сгенерированный код, например, добавив ключевое слово «virtual» или изменив «private» членов на «protected», чтобы вы могли получить к ним доступ из своего производного класса.

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

Также обратите внимание, что файл Designer - например, для Form или UserControl - обычно не полностью перезаписывается, поэтому осторожные изменения вне кода, генерируемого ядром (например, не в области «Сгенерированный код конструктора форм Windows») (могут быть сохранены). Например, иногда необходимо добавить вызов к вашему собственному пользовательскому методу очистки в методе Dispose (...) в файле Designer.

...