Type类型的DataMember

时间:2014-05-05 07:27:29

标签: c# wcf

我正在为WCF做点什么。

我使用以下ServiceContract创建了一个WCF服务:

[ServiceContract]
public interface IFrameRegistration
{
    [OperationContract]
    void RegisterFrame(Frame frame);

    [OperationContract]
    void UnregisterFrame(string frameName);

    [OperationContract]
    IList<Frame> GetRegisteredFrames();

    [OperationContract]
    Frame GetFrameByName(string frameName);
}

框架 - DataContract看起来像:

[DataContract]
public class Frame
{
    [DataMember]
    public string FrameName { get; set; }
    [DataMember]
    public Type FrameType { get; set; }
}

WCF服务工作正常。它启动,我可以从我的客户端应用程序访问它。

在我的客户端应用程序中,我想调用RegisterFrame - 方法。因此,我使用以下代码:

FrameRegistrationClient client = new FrameRegistrationClient();
client.RegisterFrame(new Frame
{
    Name = "Login",
    Type = typeof(LoginWindow)
});

LoginWindow是一个WPF窗口。

对RegisterFrame的调用抛出一个类似于:

的异常
  

带有datacontractname的“System.RuntimeType”类型   'runtimeType:http://schemas.datacontract.org/2004/07/System'不是   预期。尝试使用DataContractResolver或添加所有未知类型   到已知类型的静态列表。 ...

不确定异常消息是否正确。我把它翻译成德语。

如何将FrameType作为Type发送给我的客户?

1 个答案:

答案 0 :(得分:2)

System.Type类型不能像这样序列化。您可以添加字符串属性,如下所示:

[DataContract]
public class Frame
{
    [DataMember]
    public string FrameName { get; set; }

    [DataMember]
    public string FrameTypeName
    {
        get
        {
            // or FrameType.FullName, depends on compatibility between client & server
            return FrameType != null ? FrameType.AssemblyQualifiedName : null;
        }
        set
        {
            FrameType = value != null ? Type.GetType(value, true) : null;
        }
    }

    // don't serialize this one
    [IgnoreDataMember]
    public Type FrameType { get; set; }
}