vikasde
vikasde

Reputation: 5751

How to extend WCF returned class properly?

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?

Upvotes: 2

Views: 3768

Answers (3)

John Saunders
John Saunders

Reputation: 161773

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);
        }
    }
}

Upvotes: 12

Tejs
Tejs

Reputation: 41246

It looks like you are trying to do the equivalent of:

 BaseType client = new BaseType();
 DerivedType store = (DerivedType) client.GetStore();

You're converting to a more derived type, instead of to a lesser derived type. That would never work.

Upvotes: 2

Incognito
Incognito

Reputation: 16577

Check Data Contract KnownTypes it gives you ability to work with inheritance. Mainly gives you ability to assign object of derived class to object of parent class and more... Check KnownType and ServiceKnownType it will help you.

Upvotes: 5

Related Questions