How to extend WCF returned class properly?

casting, oop, wcf

Solution

You should not inherit from a proxy type returned from WCF. Consider that the type does not belong to you!

You can do some "extension" using the partial class feature of C#, since the proxy classes are generated as partial classes. Instead of creating class `ExtendedStore` with the `Id` property, try:

public partial class Store
{
    public int Id {get;set;}
}

This adds an Id property to the `Store` class. You can also add methods events, etc. in this manner.

The partial class will need to be defined in the same project tha contains the service reference.

Consider a project with root namespace "Project". You have a service reference named "Commerce" to a web service that returns a "Store" object. That means there is a class named `Project.Commerce.Store`:

// Proxy code generated by "Add Service Reference":
namespace Project.Commerce {
    [DataContract]
    public partial class Store {
        [DataMember]
        public string StoreName {get;set;}
        // More data members here
    }
}

You will create a folder under your project root named "Commerce". This is so that the namespaces of classes you create there will be "Project.Commerce". Then create your partial class:

// This is your code in Store.cs in the new "Commerce" folder:
namespace Project.Commerce {
    public partial class Store {
        public int Id {get;set;}
        public override string ToString() {
            return String.Format("Store #{0}: {1}", Id, StoreName);
        }
    }
}

Problem

I am using a WCF service in my project. This service returns a class called "Store". I created a new local class which inherits from "Store". My class is called "ExtendedStore". My ExtendedStore looks like this: ``` class ExtendedStore : StoreManagerService.Store { public int Id; .... } ``` Now I am using the WCF service to cast to my class using the following code: ``` StoreManagerService.StoreClient client = new StoreManagerService.StoreClient(); ExtendedStore store = (ExtendedStore) client.GetStore(); // bombs here ``` I am not able to cast the returned Store class from the service to my ExtendedStore class. I get the below error message: Unable to cast object of type 'ConsoleApplication1.StoreManagerService.Store' to type 'ConsoleApplication1.ExtendedStore'. Shouldn't I be able to cast it? If not, is there a workaround?

Original source

Related problems