Создайте протокол, подтвердите его на обоих и передайте его в качестве аргумента, вам не важно, какой это тип объекта, вам просто нужно знать, как его использовать, поэтому после завершения вы просто приводите его тип вам нужно, проверьте код ниже, я добавил Video
struct
как ваш второй, так как у вас его нет в вопросе.
protocol Switchable: Decodable {
}
struct Video: Switchable {
}
struct Photo: Switchable {
}
//Function
func fetchPhotos(url: String, completion: @escaping ([Switchable]?, Error?) -> ()) {
completion([],nil)
}
//Check on the result after completion is called
let v: [Switchable] = [Video(), Video()]
if let photos = v as? [Photo] {
print("its photos", photos)
}
if let videos = v as? [Video] {
print("its videos ",videos)
}
Вам действительно нужно реализовать собственный ModelBinder здесь? Связыватель по умолчанию может делать то, что вам нужно (так как он может заполнять коллекции и сложные объекты):
Допустим, действие вашего контроллера выглядит следующим образом:
public ActionResult SomeAction(Fund fund)
{
//do some stuff
return View();
}
И ваш html содержит это:
<input type="text" name="fund.Id" value="1" />
<input type="text" name="fund.Name" value="SomeName" />
<input type="text" name="fund.FundAllocations.Index" value="0" />
<input type="text" name="fund.FundAllocations[0].SomeProperty" value="abc" />
<input type="text" name="fund.FundAllocations.Index" value="1" />
<input type="text" name="fund.FundAllocations[1].SomeProperty" value="xyz" />
Связыватель модели по умолчанию должен инициализировать ваше объект fund с двумя объектами в списке FundAllocations (я не знаю, как выглядит ваш класс FundAllocation, поэтому я создал одно свойство "SomeProperty"). Просто убедитесь, что включили те элементы «fund.FundAllocations.Index» (которые связыватель по умолчанию рассматривает для собственного использования), которые я получил, когда попытался заставить это работать).
В последнее время я слишком много тратил на эту же вещь!
Не видя вашу HTML-форму, я предполагаю, что она просто возвращает результаты выбора из списка с множественным выбором или что-то? Если это так, ваша форма просто возвращает набор целых чисел, а не возвращает ваш гидратированный объект FundAllocations
. Если вы хотите сделать это, то в вашем собственном ModelBinder вам нужно будет выполнить свой собственный поиск и увлажнить объект самостоятельно.
Что-то вроде:
fund.FundAllocations =
repository.Where(f =>
controllerContext.HttpContext.Request.Form["FundItem.Catalogue.Id"].Contains(f.Id.ToString());
Конечно, мой LINQ только для примера, и вы очевидно, может получить данные в любом случае, что вы хотите. Между прочим, и я знаю, что это не отвечает на ваш вопрос, но после долгих раздумий я решил, что для сложных объектов лучше всего использовать ViewModel и привязать ModelBinder по умолчанию к этому, а затем, если мне нужно, увлажните модель, которая представляет мою сущность. Я столкнулся с рядом проблем, которые сделали этот выбор лучшим, я не буду утомлять вас этим, но с удовольствием экстраполирую, если хотите.
Последний подкаст Herding Code большое обсуждение этого, как и К. Скотта Аллена Помещение М в сообщениях блога MVC .