Ответ 1
Насколько я знаю, использование интерфейсов в качестве datacontracts невозможно. Вы можете использовать базовый класс и добавлять атрибуты knowntype с другой стороны.
У меня есть два класса данных, которые содержат только элементы данных (без функций). Один CallTask другой SmsTask. Эти два класса имеют некоторые общие свойства, такие как ID, Тел. Я поместил эти общие свойства в отдельный класс интерфейса, и в этом случае я использую этот класс интерфейса в своем проекте.
Теперь я добавил WCFCervice в свой проект для обмена данными между клиентами и сервером. Рассмотрим следующий класс:
public interface IGsmTask : IComparable
{
string TaskID { get; set; }
string SessionID { get; set; }
string Tel { get; set; }
}
class CallTask : IGsmTask
{
#region IGsmTask Members
public string TaskID { get; set; }
public string SessionID { get; set; }
public string Tel { get; set; }
#endregion
}
class SmsTask : IGsmTask
{
#region IGsmTask Members
public string TaskID { get; set; }
public string SessionID { get; set; }
public string Tel { get; set; }
#endregion
public string SmsText { get; set; }
}
в этом проекте, я хочу, чтобы клиенты вызывали CallTask, SmsTask и IGsmTask, чтобы использовать их в служебных метафайлах, таких как:
[OperationContract]
public void AddTask(IGsmTask task)
{
}
Я попытался отметить [DataContract] на IGsmTask, но это дает мне ошибку сложения. Не существует ли какой-либо methot, который я могу использовать в качестве DataContracts? Или как я должен использовать типы KnownAttributes в этом синергии?
Спасибо.
Насколько я знаю, использование интерфейсов в качестве datacontracts невозможно. Вы можете использовать базовый класс и добавлять атрибуты knowntype с другой стороны.
Фер: все возможно с правильным дизайном.
Если проблема:
класс - это контракт данных
& &
1 или более его свойств должен быть интерфейсом...
public interface ICustomInterface
{
int Property1 {get;set}
}
[DataContract]
public class MyClass
{
[DataMember(Name="_myInterface")]
public ICustomInterface MyInterface {get;set;}
}
Проблема заключается в том, что когда происходит де-сериализация - Невозможно преобразовать данные в класс, реализующий ICustomInterface.
Решение состоит в том, чтобы создать конкретный класс, который реализует интерфейс, и передать getter/setter открытого свойства (то есть интерфейса типа) в частное свойство конкретного класса.
public class CustomInterfaceImplementor: ICustomInterface
{
public int Property1 {get;set;}
}
[DataContract]
public class MyClass
{
[DataMember(Name="_myInterface")]
private CustomInterfaceImplementor _MyInterface;
public ICustomInterface MyInterface
{
get {return (_MyInterface as ICustomInterface);}
set {_MyInterface = (value as CustomInterfaceImplementor);}
}
}