Оператор обновления в salaryproc обновляет каждую запись в таблице персонала. Добавьте оператор where, чтобы уменьшить его до записей, которые вы хотите обновить.
update staff
set salary=@salary
where
bookingType = @booking_type
and staffType = @staff_type
Курсор и хранимая процедура могут быть упрощены, чтобы установить основанные операторы обновления. Операции на основе множеств предпочтительнее курсоров.
-- set the salary for personal + booking
update staff
set salary= 1500+2300
where
bookingType = 'personal'
and staffType = 'booking'
-- set the salary for personal + catering
update staff
set salary= 1500+1900
where
bookingType = 'personal'
and staffType = 'catering'
-- set the salary for official + booking
update staff
set salary= 1800+2300
where
bookingType = 'official'
and staffType = 'booking'
-- set the salary for official + catering
update staff
set salary= 1800+1900
where
bookingType = 'official'
and staffType = 'catering'
Разделение на подклассы является наилучшим вариантом.
Я разделил бы Ваш основной универсальный класс на подклассы:
class BaseGeneric<T,U>
с определенным классом
class MyGeneric<T> : BaseGeneric<T, string>
Это помогает сохранить Вашу логику в одном месте (базовый класс), но также и легкий предоставить обе возможности использования. В зависимости от класса существует, вероятно, очень мало дополнительной работы, должен был заставить это произойти.
C# не поддерживает такую функцию.
Как Вы сказали, можно разделить его на подклассы (если это не изолируется, и копируйте все объявления конструктора), но это - совершенно другая вещь.
К сожалению, C# не поддерживает то, что Вы пытаетесь сделать. Это была бы трудная функция для реализации, учитывая, что тип по умолчанию для параметра должен будет придерживаться универсальных ограничений и скорее всего создал бы головные боли, когда CLR пытался гарантировать безопасность типов.