C#如何在Web服务中返回我的基类

Hen*_*riM 6 c# serialization web-services derived base

我有一辆Car和派生的SportsCar:Car这样的
东西:

public class Car
{
    public int TopSpeed{ get; set; }
}


public class SportsCar : Car
{
    public string GirlFriend { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个Web服务,返回汽车的方法,即:

[WebMethod]
public Car GetCar()
{
    return new Car() { TopSpeed = 100 };
}
Run Code Online (Sandbox Code Playgroud)

它返回:

<Car>
<TopSpeed>100</TopSpeed>
</Car>
Run Code Online (Sandbox Code Playgroud)

我有另一种方法也返回这样的汽车:

[WebMethod]
public Car GetMyCar()
{
    Car mycar = new SportsCar() { GirlFriend = "JLo", TopSpeed = 300 };
    return mycar;
}
Run Code Online (Sandbox Code Playgroud)

它编译很好和一切,但在调用它时我得到:
System.InvalidOperationException:生成XML文档时出错.---> System.InvalidOperationException:不期望wsBaseDerived.SportsCar类型.使用XmlInclude或SoapInclude属性指定静态未知的类型.

我觉得奇怪的是,因为mycar是一辆汽车所以它不能将其序列化为直车.

在WebMethod上添加XmlInclude可以消除错误:

[WebMethod]
[XmlInclude(typeof(SportsCar))]
public Car GetMyCar()
{
    Car mycar = new SportsCar() { GirlFriend = "JLo", TopSpeed = 300 };
    return mycar;
}
Run Code Online (Sandbox Code Playgroud)

它现在返回:

<Car xsi:type="SportsCar">
    <TopSpeed>300</TopSpeed>
    <GirlFriend>JLo</GirlFriend>
</Car>
Run Code Online (Sandbox Code Playgroud)

但我真的希望返回基类,而不需要派生类的额外属性等.

如果没有创建映射器等,这是可能的吗?

请说是;)

Nix*_*Nix 0

对要忽略的属性使用XmlIgnoreAttribute 。或者更痛苦的方法是为您的属性实现自定义序列化

祝你好运。

public class SportsCar : Car
{
  [XmlIgnoreAttribute]
  public string GirlFriend { get; set; }
}
Run Code Online (Sandbox Code Playgroud)