0

我正在使用 WCF 和 JSON 构建一个(希望如此)RESTful 服务。

例如:

[DataContract]
public class Person
{
    // This member is serialized.
    [DataMember]
    internal string FullName;

    // This is serialized even though it is private.
    [DataMember]
    private int Age;

    // This is not serialized because the DataMemberAttribute 
    // has not been applied.
    private string MailingAddress;

    // This is not serialized, but the property is.
    private string telephoneNumberValue;

    [DataMember]
    public string TelephoneNumber
    {
        get { return telephoneNumberValue; }
        set { telephoneNumberValue = value; }
    }
}

我需要从 WCF 方法返回一个没有电话号码的 Person 对象(即仅带 FullName 和 Age),所以我想知道是否可以仅使用 Person 类和 WFC 方法的属性属性来完成它?

谢谢

五。

4

2 回答 2

2

或者,您可以使用 [DataMember(EmitDefaultValue=false)] 并将您不想序列化的字段设置为 null 或根本不初始化

例如

[DataContract]
public class Person
{
    // This member is serialized.
    [DataMember]
    internal string FullName;

    [DataMember( EmitDefaultValue=false)]
    public string TelephoneNumber
    {
        get { return telephoneNumberValue; }
        set { telephoneNumberValue = value; }
    }
}

然后你可能有 2 种方法以 2 种不同的方式加载\创建 Person

public Person LoadWithPhone() 
    {
        return new Person() { FullName = "Name", TelephoneNumber = "123456" };
    }

 public Person LoadWithoutPhone() 
    {
        return new Person() { FullName = "Name" }; //TelephoneNumber is null
    }

然后当序列化由第二种方法创建的人时,电话号码将不会被序列化这在从数据库加载对象时可能很有用,您可以有几种方法来加载不同的列,或者有一种方法正在动态构建查询并仅使用请求的字段初始化对象.

于 2013-08-09T10:47:23.120 回答
1

简单的答案是您不能这样做,但这里有一个示例,说明您无需大量工作即可实现相同目标。

您将需要有两个Person类,一个有PhoneNumber属性DataMember,一个没有。最好的方法可能是从主类创建两个子Person

[DataContract]
public class PersonWithoutPhone
{
    private Person _p;

    public PersonWithoutPhone(Person p)
    {
        _p = p;
    }

    [DataMember]
    internal string FullName
    {
        get { return _p.FullName; }
    }

    [DataMember]
    private int Age
    {
        get { return _p.Age; }
    }

    public string TelephoneNumber
    {
        get { return _p.TelephonNumber; }
    }
}

[DataContract]
public class PersonWithPhone
{
    private Person _p;

    public PersonWithoutPhone(Person p)
    {
        _p = p;
    }

    [DataMember]
    internal string FullName
    {
        get { return _p.FullName; }
    }

    [DataMember]
    private int Age
    {
        get { return _p.Age; }
    }

    [DataMember]
    public string TelephoneNumber
    {
        get { return _p.TelephonNumber; }
    }
}
于 2012-08-17T18:54:05.603 回答