我想要一个返回接口的操作合约。
我的问题:
1)我想动态注册将返回的已知类型的服务,或者让WCF接受该类型。我注意到,除非它是由属性或服务的静态方法标记的已知类型,否则该方法将失败。
2)我想在客户端,能够从消息构造接口的动态实现者。
我不想弄乱消息。我只是希望隐藏实现细节。
答案 0 :(得分:1)
我遇到了同样的情况:我认为你拥有来设计使用[KnownType]属性,以便序列化器知道要等待哪个实现。
关键是串行器接收一些字节,只有很少的关于如何读取它们的元数据(主要是类型的名称)。这就是为什么它需要知道这些字节应该代表哪种类型,以及“知道”这种类型。 如果没有这些信息,序列化程序绝对无法找出实现接口功能的几个字段的位置。
但是,您可以直接使用DataContractSerializer在运行时添加新的KnownTypes(即动态)
有关该主题的大量信息here
答案 1 :(得分:0)
您可以通过使用KnownTypeAttribute的特定重载来实现一个返回DataContract的已知类型的方法,并为其提供将已知类型作为数组返回的方法的名称。该方法可以返回仅在运行时已知的类型:
[DataContract]
[KnownType("GetKnownTypes")]
public class MyDataContract
{
public int X { get; set; }
public static Type[] GetKnownTypes()
{
return new Type[] { typeof(Class1), typeof(Class2) };
}
}