Ну ты можешь сделать так:
switch(parameter) {
case IPrintService_IncomeProductLabelParams incomeProductLabel: {
// ...
break;
}
case IPrintService_WLabelParams wLabel: {
// ...
break;
}
// итд
default:
// ...
break;
}
Но мне не понятен смысл женерика и интерфейсов с пропертями.
Ты собираешься делать параметры ещё и структурами?
В принципе тут можно избавиться от интерфейсов вообще и оставить только конкретные классы, а в IPrintService сделать несколько перегрузок, например.
Или сделать по интерфейсу для каждого типа этикеток.
Вообще, я у тебя тут вижу три разные вещи у этикеток:
1. Какой принтер используется (PrinterName)
2. Параметры задания на печать (Copy)
3. Параметры самой этикетки. Её тип и, например, SKU товара.
Попробуй подумать с этой стороны.
Например ты можешь сделать такой IPrinter, который будет принимать в себя PrintTask, у которого будет написано количество нужных копий и Payload который будет уже самой этикеткой.
Конкретная реализация IPrinter может быть привязана к одному физическому принтеру.
А Payload ты можешь формировать отдельно от сервиса печати. Например у тебя может быть какая-нибудь "служба шаблонов этикеток", в которую ты передаёшь объект с параметрами этикетки, а она отдаёт тебе уже сформированный объект этикетки, который пригоден для печати (Что там вообще принтер принимает? Картинку?)