Как правильно расширить класс WCF? - PullRequest
2 голосов
/ 20 мая 2010

Я использую сервис WCF в своем проекте. Этот сервис возвращает класс под названием «Магазин». Я создал новый локальный класс, который наследуется от «Store». Мой класс называется "ExtendedStore". Мой ExtendedStore выглядит так:

class ExtendedStore : StoreManagerService.Store
{
    public int Id;
    ....
}

Теперь я использую сервис WCF для приведения в свой класс, используя следующий код:

StoreManagerService.StoreClient client = new StoreManagerService.StoreClient();
ExtendedStore store = (ExtendedStore) client.GetStore(); // bombs here

Я не могу преобразовать возвращенный класс Store из службы в мой класс ExtendedStore. Я получаю сообщение об ошибке ниже:

Невозможно привести объект типа 'ConsoleApplication1.StoreManagerService.Store' печатать 'ConsoleApplication1.ExtendedStore'.

Разве я не смогу его разыграть? Если нет, есть ли обходной путь?

Ответы [ 3 ]

12 голосов
/ 20 мая 2010

Вы не должны наследовать от типа прокси, возвращенного из WCF. Учтите, что тип не принадлежит вам!

Вы можете сделать некоторое «расширение», используя частичный класс C #, поскольку прокси-классы генерируются как частичные классы. Вместо создания класса ExtendedStore со свойством Id попробуйте:

public partial class Store
{
    public int Id {get;set;}
}

Это добавляет свойство Id к классу Store. Вы также можете добавить методы события и т. Д. Таким образом.

Частичный класс должен быть определен в том же проекте, который содержит ссылку на службу.


Рассмотрим проект с корневым пространством имен «Проект». У вас есть ссылка на службу «Коммерция» на веб-службу, которая возвращает объект «Магазин». Это означает, что существует класс с именем Project.Commerce.Store:

// Proxy code generated by "Add Service Reference":
namespace Project.Commerce {
    [DataContract]
    public partial class Store {
        [DataMember]
        public string StoreName {get;set;}
        // More data members here
    }
}

Вы создадите папку в корневом каталоге вашего проекта с именем «Коммерция». Это сделано для того, чтобы пространства имен создаваемых вами классов были «Project.Commerce». Затем создайте свой частичный класс:

// This is your code in Store.cs in the new "Commerce" folder:
namespace Project.Commerce {
    public partial class Store {
        public int Id {get;set;}
        public override string ToString() {
            return String.Format("Store #{0}: {1}", Id, StoreName);
        }
    }
}
5 голосов
/ 20 мая 2010

Проверка данных контракта KnownTypes дает вам возможность работать с наследованием. Преимущественно дает вам возможность назначать объект производного класса объекту родительского класса и многое другое ... Проверьте KnownType и ServiceKnownType, это вам поможет.

2 голосов
/ 20 мая 2010

Похоже, вы пытаетесь сделать эквивалент:

 BaseType client = new BaseType();
 DerivedType store = (DerivedType) client.GetStore();

Вы конвертируете в более производный тип, а не в менее производный тип. Это никогда не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...