Как сохранить настройки существующих методов в автоматически сгенерированном частичном классе C#?
Я работаю с тестами пользовательского интерфейса Visual Studio Coded и хочу сохранить изменения в сгенерированном коде.
Код генерируется как частичный класс в 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 ответа
Если у вас нет контроля над самой автогенерацией (например, каркасом или сторонним генератором), ваши возможности несколько ограничены. На ум приходят два подхода: модифицировать сгенерированный код - что, как вы отметили, нецелесообразно для значительных и, возможно, накапливающихся со временем изменений - и / или создать производный класс и использовать его вместо использования auto. созданный класс напрямую (при условии, что вы управляете кодом, который будет их использовать, что кажется вероятным).
Производный класс (наследующий автоматически сгенерированный класс) сможет использовать переопределение или новый в объявлениях методов, которые вы хотите заменить. Тем не менее, есть много предостережений в отношении этого подхода. Вы можете только "переопределить" метод, который был удален как виртуальный в базовом классе (или сам по себе был переопределением другой базовой виртуальной базы и т. Д.). Вы также можете заменить метод "новым" в производном классе, но другой код в базовом классе не будет знать о вашей "новой" версии и не будет вызывать его (тогда как они будут вызывать ваш "переопределение", потому что они знать способ быть виртуальным). Есть также проблемы доступности; ваш производный класс не будет иметь доступа к закрытым членам базового класса.
Но для некоторых вещей, которые вы хотите сделать, это может сработать. В некоторых случаях вам, возможно, придется слегка изменить автоматически сгенерированный код, например, добавив ключевое слово "virtual" или изменив "private" членов на "protected", чтобы вы могли получить к ним доступ из своего производного класса.
Добавлено: Конечно, вы также можете добавить новые члены в исходный сгенерированный класс в вашем собственном постоянном файле для того же частичного класса, и этот код будет иметь доступ к закрытым членам класса. Это может быть другим способом предоставления вашему производному классу доступа к закрытым членам, например, путем создания защищенного свойства для переноса доступа к полю закрытого члена. Если вам не нужно вносить изменения в существующие методы, вам необязательно создавать производный класс, но в вашем примере говорилось о желании "переопределить" методы из автоматически сгенерированного кода, так что, предположительно, они там уже существуют.
Также обратите внимание, что файл Designer - например, для Form или UserControl - обычно не полностью перезаписывается, поэтому можно вносить осторожные изменения за пределами кода, сгенерированного ядром (например, не внутри области "Сгенерированный код конструктора форм Windows"). (и сохраняются). Например, иногда необходимо добавить вызов к вашему собственному пользовательскому методу очистки в методе Dispose(...) в файле Designer.
Здесь только один класс - myClass. Ключевое слово part позволяет разделить определение класса на несколько файлов.
Вы можете использовать частичные методы, но только если оригинальный (созданный) метод использует частичное ключевое слово. Вы не можете переопределить метод в том же классе.
См. Частичные классы и методы (Руководство по программированию в C#).