C# C Web服务和网站共享库,服务返回不同类型的库对象

C# C Web服务和网站共享库,服务返回不同类型的库对象,c#,class-library,web-services,C#,Class Library,Web Services,我现在有一个Web服务和一个Web站点,两者都在同一个解决方案中;我在解决方案中还有一个类库。web服务和网站都引用此类库 web服务有一个WebMethod,它从库中创建一个对象并返回它。该网站将调用该函数,并尝试再次从同一个库将其放入Trainer对象中 ProFitWebService.Service serviceConn = new ProFitWebService.Service(); ProFitLibrary.Trainer authenticatedTraine

我现在有一个Web服务和一个Web站点,两者都在同一个解决方案中;我在解决方案中还有一个类库。web服务和网站都引用此类库

web服务有一个WebMethod,它从库中创建一个对象并返回它。该网站将调用该函数,并尝试再次从同一个库将其放入Trainer对象中

    ProFitWebService.Service serviceConn = new ProFitWebService.Service();
    ProFitLibrary.Trainer authenticatedTrainer = (ProFitLibrary.Trainer)serviceConn.GetAuthenticatedTrainer(_TrainerLogin.UserName);
但是,出现以下情况:无法将类型ProFitWebService.Trainer转换为ProFitLibrary.Trainer

以下是WebMethod:

[WebMethod]
public ProFitLibrary.Trainer GetAuthenticatedTrainer(string email)
{
    ProFitLibrary.Trainer returnTrainer = new ProFitLibrary.Trainer();
    SqlCommand cmd = new SqlCommand("SELECT * FROM Trainers WHERE EmailAddress = '" + email + "'", conn);
    conn.Open();

    SqlDataReader reader;
    reader = cmd.ExecuteReader();

    while (reader.Read())
    {
        returnTrainer.TrainerId = reader.GetInt32(reader.GetOrdinal("TrainerId"));
        returnTrainer.FirstName = reader.GetString(reader.GetOrdinal("FirstName"));
        returnTrainer.LastName = reader.GetString(reader.GetOrdinal("LastName"));
        returnTrainer.PhoneNumber = reader.GetString(reader.GetOrdinal("PhoneNumber"));
        returnTrainer.Address = reader.GetString(reader.GetOrdinal("Address"));
        returnTrainer.City = reader.GetString(reader.GetOrdinal("City"));
        returnTrainer.PostalCode = reader.GetString(reader.GetOrdinal("PostalCode"));
        returnTrainer.EmailAddress = reader.GetString(reader.GetOrdinal("EmailAddress"));
    }

    return returnTrainer;
}
更新:将Trainer对象更改为ProFitWebService。网站上的Trainer解决了以下问题:

    ProFitWebService.Service serviceConn = new ProFitWebService.Service();
    ProFitWebService.Trainer authenticatedTrainer = (ProFitWebService.Trainer)serviceConn.GetAuthenticatedTrainer(_TrainerLogin.UserName);
我认为答案很简单,从Web服务返回的库对象将始终基于类型/以服务为前缀-我不应该同时引用网站和服务中的类库-我应该始终创建对象的Web服务版本-ProFitWebService.Trainer等


当您在web服务中使用库时,是否有人可以确认这是一种标准做法?或者,如果我让这变得更困难,那么它真的是

当使用反射时,当实际程序集不同时(不同版本、编译时,甚至有时使用程序集的不同副本时),可能会发生这种情况。我不确定您的代码是否使用反射…

当使用反射时,当实际的程序集不同时,可能会发生这种情况-可能是不同的版本、编译时,有时甚至是使用不同的程序集副本时。我不确定您的代码是否使用反射…

这里的问题是web服务的客户端实际上是一个代理或生成的对象,而不是您所期望的正常类型。我认为您必须将类型映射到所需的实例中。

这里的问题是,web服务的客户端实际上是一个代理或生成的对象,而不是您所期望的普通类型。我认为您必须将类型映射到所需的实例中。

创建对web服务的web引用时,您将获得为您生成的代理类。这些代理类看起来像库中的类,但它们的类型不同。如果要将从web服务返回的对象视为共享库中的类型,则需要使用某种方法在这些类型的库版本和代理版本之间进行转换。

创建对web服务的web引用时,将为您生成代理类。这些代理类看起来像库中的类,但它们的类型不同。如果要将从web服务返回的对象视为共享库中的类型,则需要在这些类型的库版本和代理版本之间进行一些方法转换。

我所做的是为每个类生成扩展方法,以将它们转换为正确的签名。
当您有20个业务类在6个web服务之间共享时,就没有那么有趣了:“

我所做的是为每个类创建扩展方法,将它们转换为正确的签名。 当您有20个业务类在6个web服务之间共享时,就没有那么多乐趣了: