Если бы API был внешним объектом, я бы использовал общие c функции, например:
static T ApplyTemplate<T> (T target, T template) where T : IApiObject {
foreach (Object prop in template.properties) {
if (prop != null) {
// call API put for that property, using
// the id of the input object.
API::Put(target.id, prop.name, prop.value);
return API::Get(target.id);
}
}
}
result = API::ApplyTemplate(target, template);
Но я считаю этот стиль API очень неуклюжим. Я бы предпочел работать непосредственно с объектом и встроить API в объект данных.
o = new Api.Foo()
o.id = 1;
o.Load; // Retrieve attributes using the API.
o.bar = 'Test';
o.baz = 42;
o.Save; // Send changes using the API.
Проблема в том, что у меня есть 40 объектов с почти идентичным кодом для API, и я проклят если правильный способ справиться с этим - переписать код для каждого объекта. Я хочу определить API в родительском классе или в классе интерфейса, но не могу понять, как это правильно написать. Невозможно определить параметры общей функции c как принадлежащие к тому же типу, что и this
, и каждый раз, когда я пытаюсь подойти к этому, эта проблема сбивает меня с толку. повторение полностью шаблонного кода в каждом соответствующем объекте, но я хотел бы знать способ получше.
Обратите внимание, что API активно использует JSON, и объекты, в которых я бы хотел избежать повторного написания кода снова и снова начал свою жизнь как объекты Newtonsoft. Json [DataContract].