.net 抽象类的所有派生类型的KnownType?

.net 抽象类的所有派生类型的KnownType?,.net,wcf,abstract-class,known-types,.net,Wcf,Abstract Class,Known Types,我们有一个抽象类,它是通过WCF服务发送的许多不同请求的基础。每次添加新请求时,我们都必须记住向这个基类添加[KnownType]属性,这是一个丑陋的、令人发指的黑客行为 有没有办法告诉DataContractSerializer将此抽象类型的所有派生都视为KnownType 我在一个WCF服务中也遇到了同样的问题,为了绕过已知的类型限制,我做了以下“不那么令人发指”的破解。我只是为了展示备选方案而做了概述,这取决于你自己决定是否更好 在服务启动时,通过反射加载要公开的类型。例如,如果所有WCF

我们有一个抽象类,它是通过WCF服务发送的许多不同请求的基础。每次添加新请求时,我们都必须记住向这个基类添加
[KnownType]
属性,这是一个丑陋的、令人发指的黑客行为


有没有办法告诉
DataContractSerializer
将此抽象类型的所有派生都视为
KnownType

我在一个WCF服务中也遇到了同样的问题,为了绕过已知的类型限制,我做了以下“不那么令人发指”的破解。我只是为了展示备选方案而做了概述,这取决于你自己决定是否更好

  • 在服务启动时,通过反射加载要公开的类型。例如,如果所有WCF公开的实体都派生自一个或多个公共抽象基,则从应该位于其中的程序集中加载所有类型。出于性能原因,静态缓存这些类型

  • 创建一个静态方法,该方法返回所述缓存类型,并具有以下签名:
    公共静态IEnumerable GetKnownTypes(ICustomAttributeProvider提供程序)

  • 使用以下属性标记WCF接口
    [ServiceKnownType(“GetKnownTypes”,typeof(StaticClassThatCachesTypes))]


  • 这将使您能够自动公开从您选择的基类派生的或将派生的所有类型,只要未来的开发人员将它们放置在正确的程序集中。

    除了Dan C给出的选项之外,另一个选项是切换到-它不需要已知的类型声明,由于它与确切的契约实现紧密耦合,因此您需要在客户机和服务器之间共享包含类型的程序集—在这种情况下,您肯定会失去互操作性。有一些帖子是关于这样做的(我经常在google/bing的结果中看到弹出窗口)。

    就是用PostSharp这样做的一个例子。朝着帖子的底部看。

    是使用/实现IL编织的一个例子

    基本上,这是一个使用IL编织在构建时注入的扩展

    在构建管道期间,扩展将定位所有标记有KnowsDeliveTypes属性(扩展的一部分)的基类,并将KnownTypeAttribute添加到所有派生的类(而不是 必须直接)来自上述基类之一(具有KnowsDeliveryPSAttribute)


    是这篇文章的另一面镜子,你可以找到扩展版的Github回购协议。

    是的,我希望避免这种依赖。谢谢你的建议,谢谢你。如果不同类型的合同有多个基本类型(每个基本类型都必须有一个静态助手),那么它实际上不会向外扩展,但它确实会将人员元素去掉。:)@乔:不一定。如果您有多个基类,那么在步骤1中,没有任何东西可以阻止您一次性加载它们的所有派生类型。GetKnownTypes必须返回类型列表。实际的限制是,您必须知道所有的基类(并在添加新的基类时调整类型加载器),并且必须知道它们的位置。接受这一点是一个不错的解决方法。在语言/编译器级别拥有一些更智能的东西还是不错的…不要只发布链接答案;如果链接消失了,那么这是一篇无用的帖子。@Joe我已经为链接添加了一个简短的解释和更多的镜像。我不确定用一个答案来解释整篇博文是否是个好主意。