Как пометить интерфейс как DataContract в WCF


У меня есть два класса данных, которые содержат только элементы данных (без функций). Один 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 в этом синергии?
Спасибо.

Ответ 1

Насколько я знаю, использование интерфейсов в качестве datacontracts невозможно. Вы можете использовать базовый класс и добавлять атрибуты knowntype с другой стороны.

Ответ 2

Фер: все возможно с правильным дизайном.

Если проблема:

класс - это контракт данных

& &

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);}
     }
}