ServiceKnownType[
^] always does the trick for me. Admittedly, I do not use
object
as my return type, but I often use interfaces in conjunction with
ServiceKnownType
attributes.
I assume that there is no common interface that the classes of the objects that you return would implement, otherwise you would declare your
Item
property as such. In cases like that (i.e. when I must return objects from disjoint class hierarchies) I use "poor man's variant" implementation, which looks as follows:
[DataContract]
public class ReturnType1 {...}
[DataContract]
public class ReturnType2 {...}
[DataContract]
public class ReturnType3 {...}
[DataContract]
public class ReturnVariant {
[DataMember] private ReturnType1 RetMember1 {get; set}
[DataMember] private ReturnType2 RetMember2 {get; set}
[DataMember] private ReturnType3 RetMember3 {get; set}
public object Item {
get {
return RetMember1 ?? RetMember2 ?? (object)RetMember3;
}
}
public ReturnVariant(object item) {
if (item is ReturnType1) RetMember1 = (ReturnType1)item;
else if (item is ReturnType2) RetMember2 = (ReturnType2)item;
else if (item is ReturnType3) RetMember3 = (ReturnType3)item;
else throw new ArgumentException("item");
}
}
Use
ReturnVariant
to encapsulate your objects.