Я получаю JSON из внешнего источника (с информацией о типе в нем), который я десериализую с помощью JSON.NET
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.TypeNameHandling = TypeNameHandling.All;
//because the type info is included 'obj' will be of type Foo, Bar, Baz, etc
var obj = JsonConvert.DeserializeObject(jsonString, settings);
Я также получаю тип команды, которую мне нужно выполнить на объекте (например, «Отправить», «Получить», «Удалить» и т. Д.). Я использую это, чтобы вызвать правильный метод на службе. Служба определяет свои методы для каждого типа в этом формате (примечание: я не поддерживаю службу, я просто называю ее):
///where T has an implementation for each type (Foo, Bar, etc)
T Send(T objToSend)
T Retrieve (T objToRet)
T Remove (T objToRemove)
так например:
Foo f = service.Send(aFoo);
Bar b = service.Send(aBar);
Foo f2 = service.Retrieve(aFoo);
Bar b2 = service.Retrieve(aBar);
есть ли более элегантный способ сделать это, кроме большого оператора switch и блоков if-else для каждого типа? Это будет работать, но кажется действительно неуклюжим, и если мы продолжим добавлять типы, это только приведет к более грубому
switch(command){
case "Send":
if(obj is Foo){
service.Send((Foo)obj);
}
if(obj is Bar){
service.Send((Bar)obj);
}
if(obj is Baz){
service.Send((Baz)obj);
}
break;
case "Retrieve":
//etc...
case "Remove":
//etc...
}
спасибо за любые идеи, которые вы можете предоставить