我正在使用F#编码的服务器。该服务器连接到使用C#编码的WCF REST服务。
我的F#项目引用了C#程序集。
在我的C#中,我有namespace GlobalNotificationService.DTO
:
public class Producer
{
[DataMember(Name = "Name", IsRequired = true, Order = 1)]
public string Name {get; set;}
...
public string Marshal()
{
StringBuilder sb = new StringBuilder();
using (XmlTextWriter textWriter = new XmlTextWriter(new StringWriter(sb)))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(DTO.Producer));
serializer.WriteObject(textWriter, this); //THIS IS THE LINE THROWING THE EXECPTION
textWriter.Flush();
textWriter.Close();
return sb.ToString();
}
}
}
在我的F#中,我有
namespace ServiceCore
:type Producer(file_name) as this =
inherit DTO.Producer()
...
member public this.SerializedXML
with get() = this.Marshal() //Call to C# assembly
因此,代码确实可以编译,但是在运行时出现此异常(请查看上面的注释)。
输入带有数据协定名称的“ ServiceCore.Producer”
'生产者:http://schemas.datacontract.org/2004/07/ServiceCore'不是
预期。考虑使用DataContractResolver或不添加任何类型
已知类型列表中的静态已知-例如,通过使用
KnownTypeAttribute属性或通过将它们添加到
已知类型传递给DataContractSerializer。
问题是:
为什么“ this”类型为ServiceCode.Producer(F#),即使该方法应该已经转换为DTO.Producer(C#),因为该方法位于DTO.Producer类中,并且我明确要求DTO.Producer序列化?
补充问题:
我们为什么还要担心调用来自后代类呢?我们的“ this”参考仍应向上转换,并且应为DTO.Producer类型。
这对我来说意义不大,我想念什么吗?
最佳答案
由于您要在元帅中明确实例化DCS,因此可以将其定义更改为
public string Marshal<T>()
...
new DataContractSerializer(typeof<T>) ...
然后F#代码可以使用自己的子类型调用元帅。