如何正确扩展WCF返回类?

vik*_*sde 2 oop wcf casting

我在我的项目中使用WCF服务.此服务返回一个名为"Store"的类.我创建了一个继承自"Store"的新本地类.我的班级叫做"ExtendedStore".我的ExtendedStore看起来像这样:

class ExtendedStore : StoreManagerService.Store
{
    public int Id;
    ....
}
Run Code Online (Sandbox Code Playgroud)

现在我使用WCF服务使用以下代码强制转换为我的类:

StoreManagerService.StoreClient client = new StoreManagerService.StoreClient();
ExtendedStore store = (ExtendedStore) client.GetStore(); // bombs here
Run Code Online (Sandbox Code Playgroud)

我无法将返回的Store类从服务转换为我的ExtendedStore类.我收到以下错误消息:

无法将"ConsoleApplication1.StoreManagerService.Store"类型的对象强制转换为"ConsoleApplication1.ExtendedStore".

我不应该投这个吗?如果没有,是否有解决方法?

Joh*_*ers 12

您不应该从WCF返回的代理类型继承.考虑到该类型不属于您!

您可以使用C#的分部类功能执行一些"扩展",因为代理类是作为部分类生成的.不要ExtendedStore使用Id属性创建类,请尝试:

public partial class Store
{
    public int Id {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

这会向Store类添加Id属性.您还可以通过这种方式添加方法事件等.

部分类需要在包含服务引用的同一项目中定义.


考虑具有根命名空间"Project"的项目.您有一个名为"Commerce"的服务引用到一个返回"Store"对象的Web服务.这意味着有一个名为的类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
    }
}
Run Code Online (Sandbox Code Playgroud)

您将在项目根目录下创建一个名为"Commerce"的文件夹.这样您在那里创建的类的名称空间将是"Project.Commerce".然后创建你的部分类:

// 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Inc*_*ito 5

检查Data Contract KnownTypes,它使您能够使用继承.主要是让你能够将派生类的对象分配给父类的对象等等...检查KnownType和ServiceKnownType它会对你有所帮助.

  • 另请参阅http://stackoverflow.com/questions/560218/wcf-configuring-known-types,了解如何在App.config配置中完全执行此操作.如果您不能在服务合同中更改`StoreManagerService.Store`或提供`ServiceKnownType`,那么这将是必要的. (2认同)