def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
timesheet_jobs = self.fields['timesheet_jobs']
timesheet_jobs.choices = list(timesheet_jobs.choices)
timesheet_jobs.choices.append(tuple(('create_new_job', 'Create New Job')))
Короткий ответ не, Вы не можете возвратить интерфейс через WebService.
Длинный ответ - то, что можно отчасти получить поведение, которое Вы хотите, но это - немного hacky. Решение состоит в том, чтобы использовать двоичную сериализацию. Таким образом, Вы сериализируете свой тип к байтам, имеете веб-возврат метода ряд байтов, и затем с другой стороны Вы десериализовали бы байты назад к Вашему составному типу.
Например,
[WebMethod]
public byte[] GetMyComplexType()
{
IMyComplexType myCt = new MyComplexType();
...
MemoryStream stream = new MemoryStream();
IFormatter fmt = new BinaryFormatter();
fmt.Serialize(stream, myCt);
stream.Flush();
byte[] bytes = stream.ToArray();
stream.Close();
return bytes;
}
Необходимо будет преобразовать все назад в другом конце.
byte[] bytes = service.GetMyComplexType();
MemoryStream stream = new MemoryStream(bytes);
BinaryFormatter fmt = new BinaryFomatter();
MyComplexType myCt = fmt.DeSerialize(stream);
Можно, вероятно, очистить десериализацию путем создания общего метода. Я должен добавить, что необходимо будет удостовериться, что можно сослаться на составной тип на клиенте.
С другой стороны, если они - Ваши интерфейсы затем, Вы могли бы превратить их в Абстрактные классы. Однако это не будет работать, если Вы захотите, чтобы класс реализовал несколько интерфейсов (или Вы уже наследовались другому классу), как можно только наследовать один класс. При необходимости в некотором полиморфном поведении на клиенте необходимо будет использовать атрибут XmlInclude.
Это было некоторое время, но я полагаю, что Вы должны только заставить свои интерфейсы расшириться ISerializable
и все должны быть хорошими.
Вы не должны реализовывать ISerializable
- просто отмечая интерфейс с Serializable
атрибут должен быть всем, что необходимо сделать. Если Вы захотите реализовать интерфейс, любой ценой идти вперед то - он даст Вам мелкомодульный контроль над тем, как интерфейс сериализируется. Но я предположил бы, что реализация по умолчанию должна быть в порядке. Также проверьте, чтобы удостовериться, что все интерфейсные участники являются сериализуемыми также.
[Редактирование] я даже не думал прямо - нет никакого способа, которым Вы сможете реализовать ISerializable
поскольку Вы пытаетесь сериализировать iterface так или иначе. Место, где ISerializable
было бы соответствующим, будет на пользовательских типах, которым нужна пользовательская сериализация, которые выставляются интерфейсом.