我正在使用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#代码可以使用自己的子类型调用元帅。

10-08 12:34