WCF и различные возвращения классифицированы - PullRequest
0 голосов
/ 20 июня 2011

Я столкнулся с проблемой, для которой не могу найти хорошего решения - у меня есть служба WCF, где я хочу вернуть объект ChildClass, который наследуется от FatherClass.

В основномЯ бы вернул ChildClass, но в некоторых случаях я хотел бы вернуть только FatherClass (который содержит только 1 поле «error»).

Можно ли это сделать?

MyКод:

[WebGet(UriTemplate = "SomeQueryString", ResponseFormat = System.ServiceModel.Web.WebMessageFormat.Json)]
public ChildClass GetCollection(parameter)
{

    if (err)
    {
        return new FatherClass();
    }
    else
    {
        return new ChildClass();
    }
}

Где ChildClass наследует от FatherClass (имеет меньше полей).

Моя цель - вернуть только очень небольшую часть «текста» вместо текста, который будетбудет возвращен, если я верну весь объект ChildClass.

Идеи?:)

Спасибо!

Ответы [ 2 ]

3 голосов
/ 20 июня 2011

Это возможно, только если вы переопределите свою операцию и контракты - вы должны вернуть parent и сериализатор должен знать обо всех дочерних элементах, которые могут использоваться вместо родительского:

[KnownType(typeof(ChildClass)]
[DataContract]
public class ParentClass 
{
    // DataMembers
}

[DataContract]
public class ChildClass : ParentClass 
{
    // DataMembers
}

И ваша операция будет выглядеть:

[WebGet(UriTemplate = "SomeQueryString", ResponseFormat = System.ServiceModel.Web.WebMessageFormat.Json)]
public ParentClass GetCollection(parameter)
{
    ...
}
0 голосов
/ 20 июня 2011

Я думаю, что это вопрос о C # и приведении типов.Как у вас есть, он не будет работать, потому что ChildClass: FatherClass.См. Ниже:

    class FatherClass
    {
        public int x { get; set; }
    }

    class ChildClass : FatherClass
    {
        public int y { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            FatherClass a = new FatherClass();
            ChildClass b = new ChildClass();


            FatherClass c = (FatherClass)b;
            ChildClass d = (ChildClass)a;

            Console.ReadLine();
        }
    }

приведение класса ChildClass d = (ChildClass) a;не удастся.Таким образом, вы можете попробовать изменить свою подпись на

public FatherClass GetCollection(parameter)

и использовать соответствующий тип приведения.

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