部分类通过Web服务引用丢失

时间:2012-04-03 13:43:27

标签: c# web-services asmx partial-classes

我有一个webservice项目(旧的asmx技术),我有一个类User。此类具有DateTime属性,该属性表示此用户的生日。除了这个类之外,我还有另一个带有部分类User的文件。在这个部分类中,我添加了一个属性'Age',它返回用户的年龄:

public partial class User
{
    public DateTime Age
    {
        get { return DateTime.Now - this.Birthdate; }
    }
}

这是部分类的原因是因为User类代码是从配置文件自动生成的,并且我不能在每次生成代码时都不删除代码而不删除它。

现在在我的网络服务中,我有一个webmethod,它返回从数据库中获取的这些用户的列表:

[WebMethod]
public List<User> GetUsers()
{
    return Database.LoadUsers();
}

足够简单......无论如何,现在在一个不同的项目中,我为这个Web服务添加了一个服务引用。它为我生成服务客户端和User类。问题是:此User类不包含在partial类中定义的属性(在此示例中为Age)...似乎webservice没有获取此信息。

当然我可以创建一个新的部分User类,并基本上在第二个项目中重写它,但我不应该,我应该吗?为什么web服务不识别部分类?

2 个答案:

答案 0 :(得分:3)

部分类不是扩展方法。它们在每个程序集中一起编译成一个类。您有两种选择:

选项1

Add the partial class you wrote as a link到新项目。它将是同一个文件,但链接到新项目中。当你去Add - &gt;现有项目,通过打开选择箭头,然后选择“添加为链接”。

选项2

创建扩展方法:

public static class DateExtensions
{
    public TimeSpan GetAge(this DateTime birthDate)
    {
        return DateTime.Now - birthDate;
    }
}

然后,只需为扩展类所在的命名空间添加using语句,并确保引用项目/程序集,然后可以调用它:

// This is your BirthDate property that would come back and is DateTime
var birthDate = new SomeService().DoSomething().BirthDate;

var age = birthDate.GetAge();

选项3

创建一个单独的项目并将服务引用和部分放在其中。使用项目从引用项目(以及必要的框架引用)。

我创建了an example for you to view/use on GitHub

答案 1 :(得分:0)

如果必须将客户端与服务紧密耦合,那么您可以使用服务引用来重用服务使用的相同类型。只需将有问题的类型移动到他们自己的项目和程序集中,并从客户端和服务器项目中引用它。

我的犹豫是,这适用于WCF服务,但我从未使用ASMX服务。