using System.Collections.Generic;
public int EmployeeId {get;set;}
public Departments Department {get;set;}
public bool F1001 {get;set;}
public bool F1002 {get;set;}
public interface IParams{
public class MainSearchParams : IParams{
public MainSearchParams(){}
public MainSearchParams(Settings settingsModel, string search){
SettingsModel = settingsModel;
Id = settingsModel.EmployeeId;
public Settings SettingsModel {get;set;}
public string Search {get;set;}
public static implicit operator ShippingSearchParams(MainSearchParams src)
return new ShippingSearchParams{
Id = src.SettingsModel.EmployeeId,
LogicSwitch = src.SettingsModel.F1001
public static implicit operator ReceivingSearchParams(MainSearchParams src)
return new ReceivingSearchParams{
Id = src.SettingsModel.EmployeeId,
LogicSwitch = src.SettingsModel.F1002
public class ShippingSearchParams : IParams {
public string Search {get;set;}
public bool LogicSwitch {get;set;}
public class ReceivingSearchParams : IParams {
public string Search {get;set;}
public bool LogicSwitch {get;set;}
public static class MagicConverter
public static IParams Convert(MainSearchParams src)
var lu = new Dictionary<Departments, Func<MainSearchParams, IParams>>{
{Departments.Shipping, GetShipping},
{Departments.Receiving, GetReceiving}
return lu.TryGetValue(src.SettingsModel.Department, out var converter) ?
private static IParams GetShipping(MainSearchParams src){
return new ShippingSearchParams{
Id = src.SettingsModel.EmployeeId,
LogicSwitch = src.SettingsModel.F1001
private static IParams GetReceiving(MainSearchParams src){
return new ReceivingSearchParams{
Id = src.SettingsModel.EmployeeId,
LogicSwitch = src.SettingsModel.F1002
private static readonly Dictionary<Departments, Func<MainSearchParams, string>> _lu =
new Dictionary<Departments, Func<MainSearchParams, string>>
{Departments.Shipping, SearchShipping},
{Departments.Receiving, SearchReceiving}
public static void Main()
var settings = new Settings{ EmployeeId = 42, Department = Departments.Receiving, F1001 = true, F1002 = true};
var p = new MainSearchParams(settings, "Tuna");
var result = _lu.TryGetValue(settings.Department, out var searchFunc) ?
Console.WriteLine($"result: {result}");
Console.WriteLine("Done");
private static string SearchShipping(MainSearchParams p) => SearchShipping((ShippingSearchParams)p);
private static string SearchShipping(ShippingSearchParams p){
private static string SearchReceiving(MainSearchParams p) => SearchReceiving((ReceivingSearchParams)p);
private static string SearchReceiving(ReceivingSearchParams p){