I want to use an abstract class to define it as DataContract for WCF. The following example shows how I define my abstract class UpperClass
.
[DataContract(IsReference = true)]
[KnownType(typeof(SubClass1))]
[KnownType(typeof(SubClass2))]
abstract public class UpperClass
{
abstract public void update();
}
SubClass1
and SubClass2
inherit from UpperClass
. Actually, they only share 1 method named update()
, which is only used internally (not a DataMember). The following code shows the implementation of SubClass1
and SubClass2
:
[DataContract]
public class SubClass1 : UpperClass
{
private int[] _val1;
private int[] _val2;
//internal constructor:
public SubClass1()
{
_val1 = new int[2];
_val2 = new int[2];
//initialize values of _val1 and _val2 ...
}
//internal update method
public override void update()
{
//here comes update formulas...
}
//enable simple access from WCF client:
[DataMember]
public int[] val1
{
get { return _val1; }
set { _val1 = value; }
}
[DataMember]
public int[] val2
{
get { return _val2; }
set { _val2 = value; }
}
}
[DataContract]
public class SubClass2 : UpperClass
{
private int[] _value1;
private int[] _value2;
//internal constructor:
public SubClass2()
{
_value1 = new int[12];
_value2 = new int[12];
}
// ...
On the server side, I supply my survice using the following code, which is defined as [OperationContract(IsInitiating = true, IsTerminating = false)] in its Interface-class.
public UpperClass init(string s)
{
if (s.Equals("SubClass1"))
obj = new SubClass1();
else if (s.Equals("SubClass2"))
obj = new SubClass2();
return obj;
}
And on the client side, I consume (or initialize) my service using:
UpperClass DatSet = proxy.init("SubClass1");
When I debug to the end of this line, the content of DatSet
looks very strange:
{MyExternalLayer.IMyProcessingLayer_proxy.SubClass1} [MyExternalLayer.IMyProcessingLayer_proxy.SubClass1]: {MyExternalLayer.IMyProcessingLayer_proxy.SubClass1} ExtensionData: {System.Runtime.Serialization.ExtensionDataObject} extensionDataField: {System.Runtime.Serialization.ExtensionDataObject} PropertyChanged: null