转换对象

时间:2011-09-01 16:37:20

标签: c# web-services

是否有简单的方法将一个对象转换为另一个对象,首先在应用程序对象模型中定义,另一个在Web服务引用中定义。两个对象的定义是相同的。

3 个答案:

答案 0 :(得分:3)

如果您使用的是WCF,您实际上可以与该服务的客户共享WCF服务中定义的类型。

请参阅本文使用客户端上的员工类部分:

http://10rem.net/blog/2009/07/13/sharing-entities-between-wcf-and-silverlight

Web服务中定义的类型可供(.NET)客户端使用,方法是选择重用在WCF端定义的类型。

更新:

正如我在其中一条评论中所承诺的,这里是使用序列化创建对象副本的代码。我包含了一个需要特定类的变体,以及一个使用泛型来支持任何可序列化类型的变体。在许多情况下,您可以使用BinarySerializer替换DataContractSerializer。

static public Organization Copy(Organization org)
{
    MemoryStream stream1 = new MemoryStream();

    //Serialize the Record object to a memory stream using DataContractSerializer.
    DataContractSerializer serializer = new DataContractSerializer(typeof(Organization));
    serializer.WriteObject(stream1, org);

    stream1.Position = 0;
    //Deserialize the Record object back into a new record object.
    Organization orgCopy = (Organization)serializer.ReadObject(stream1);

    return orgCopy;
}

static public T Copy<T>(T obj)
{
    MemoryStream stream1 = new MemoryStream();

    //Serialize the Record object to a memory stream using DataContractSerializer.
    DataContractSerializer serializer = new DataContractSerializer(typeof(T));
    serializer.WriteObject(stream1, obj);

    stream1.Position = 0;
    //Deserialize the Record object back into a new record object.
    T objCopy = (T)serializer.ReadObject(stream1);

    return objCopy;
}

答案 1 :(得分:1)

您可以将对象映射到另一个具有辅助类的对象,该辅助类将成员复制/分配给成员。

一般来说,最好的方法是避免这种转换,特别是如果对象与您的情况相同

这可以通过良好的设计来避免,例如在WCF中指定数据协定并使这些类实现在服务和应用程序中共享的公共接口,那么当然你应该在所有地方编程对接口而不是实现它的类。

对于旧的XML Web服务,当数据契约尚未可用时,仍然可以使用接口完成某些操作,但是它还取决于您公开类型的方式,如果服务返回其自己类型的类或者在公共类/接口库中定义的类型。

答案 2 :(得分:1)

您可以使用AutoMapper执行此操作:

  

AutoMapper是一个对象 - 对象映射器... AutoMapper效果最佳   只要成员的名称与源类型匹配即可   成员。如果您有一个名为“FirstName”的源成员,则会这样做   自动映射到具有名称的目标成员   “姓”。