クラス Car と派生した SportsCar: Carがあります。次の
ようなものです。
public class Car
{
public int TopSpeed{ get; set; }
}
public class SportsCar : Car
{
public string GirlFriend { get; set; }
}
車を返すメソッドを持つWebサービスがあります。
[WebMethod]
public Car GetCar()
{
return new Car() { TopSpeed = 100 };
}
戻り値:
<Car>
<TopSpeed>100</TopSpeed>
</Car>
次のような車も返す別のメソッドがあります。
[WebMethod]
public Car GetMyCar()
{
Car mycar = new SportsCar() { GirlFriend = "JLo", TopSpeed = 300 };
return mycar;
}
それは問題なくすべてコンパイルされますが、呼び出すと次のようになります:
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;
}
そしてそれは今返します:
<Car xsi:type="SportsCar">
<TopSpeed>300</TopSpeed>
<GirlFriend>JLo</GirlFriend>
</Car>
しかし、派生クラスから余分なプロパティなどを除いて、基本クラスが返されることを本当に望んでいます。
マッパーなどを作成しなくても、それはまったく可能ですか?
良いと言って ;)