2014-06-13 3 views
0

В настоящее время я работаю над довольно простым приложением, которое использует классы Linq-to-SQL. Я добавляю новые методы и свойства в автоматически генерируемые dataclasses, используя тот факт, что они являются «частичными». Однако теперь я хотел бы фактически изменить код, содержащийся в одном методе класса, а именно SendPropertyChanged().Замена автоматически генерируемого кода на C#

Простейший способ, которым я могу это сделать, - это изменить код в самогенерированном файле .designer.cs, но я вижу, как это довольно опасно (поскольку код может быть перезаписан генератором кода). Есть ли альтернативный способ для меня безопасно изменить код?

EDIT: Почему я хочу это сделать: я хочу добавить свойство «isDirty», которое задается при каждом изменении любого поля. Поскольку всякий раз, когда изменяется поле, он вызывает метод SendPropertyChanged, я полагал, что я бы просто нажал «isDirty = true» там (с соответствующими проверками).

+1

Это звучит неплохо, каждый раз, когда вы обновляете свой dbml, вы потеряете свои изменения. Почему вы хотите его заменить? Не можете ли вы использовать один из частичных методов? – Liath

+1

Я хочу добавить свойство isDirty в класс, который устанавливается, когда какое-либо из полей обновляется. Я [i] мог использовать [/ i] события onFieldChanged() (и, не найдя подходящего альтернативного метода, я, вероятно, буду), и добавлю их в частичный класс, но он кажется слишком неэлегантным. –

+0

Это также плохая идея использовать LINQ to SQL. Если у вас есть этот параметр, я бы рекомендовал переключиться на более зрелую, поддерживаемую ORM, такую ​​как Entity Framework или nHibernate. L2S больше не разрабатывается ... он мертв. –

ответ

0

Невозможно сменить автоматически сгенерированные файлы, поскольку очевидная причина заключается в том, что они будут заменяться каждый раз, когда что-то изменяется, а среда IDE генерирует его.

Если вы действительно хотите их изменить, а так как это классы partial, вы можете переопределить их как частичные или лучше, если вы можете подклассифицировать их.

Существует еще один вариант, который вы можете исследовать, использует Extension Methods, это очень простой способ добавить функциональные возможности для классов, не изменяя их

+0

Значение 'SendPropertyChanging' и т. Д. Заключается в том, что сгенерированные свойства автоматически вызывают их; добавление метода расширения не приведет к тому, что это произойдет –

+0

@MarcGravell Да, просто видел комментарий, не знал, что он хотел это сделать. –

0

Идея заключается в том, что вы добавить свой код в On*Changing и On*Changed методы, например:

partial void OnNameChanged() { 
    // my code here 
} 

Вас может также подписаться на PropertyChanging/PropertyChanged, но это, как правило, плохая практика (подписавшись на ваших собственных событий), и будет иметь накладные расходы производительности ,

+0

Действительно, методы On * Shanged - это мое последнее средство. Я просто подумал, что немного неэлегантно добавить одну строку кода в каждый вызов метода (для каждого поля базы данных), когда уже был еще один метод (SendPropertyChanged), который также уже вызван. –

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