如何重命名子类中继承的API成员?

时间:2018-10-30 00:37:16

标签: c# servicestack

说我有

public class Parent{
    [ApiMember(Name = "parentItem")]
    public string Item {get; set;}
}

public class Child : Parent {
    [ApiMember(Name = "childItem")]
    public new string Item {get; set;}
}

由于应该隐藏父类中的'Item'属性,为什么用{"childItem": "something"}发出请求会返回Could not find property childItem on RequestObject?也就是说,重命名子类中继承的API成员/属性的最佳方法是(或有办法)?

2 个答案:

答案 0 :(得分:2)

[DataContract][DataMember]属性会影响序列化,其中[Api*]属性仅用于记录和添加有关您的API的额外元数据,但不会影响序列化行为。

因此,您应该将DTO更改为:

[DataContract]
public class Parent
{
    [DataMember(Name = "parentItem")]
    public virtual string Item { get; set; }
}

[DataContract]
public class Child : Parent 
{
    [DataMember(Name = "childItem")]
    public override string Item { get; set; }
}

在大多数ServiceStack序列化程序中进行序列化时将在何处使用它们,例如:

var json1 = new Parent { Item = "parent" }.ToJson();
json1.Print();

var json2 = new Child { Item = "child" }.ToJson();
json2.Print();

哪个输出:

{"parentItem":"parent"}
{"childItem":"child"}

您可以try this example Live on Gistlyn

答案 1 :(得分:1)

尝试在父级中将属性虚拟化,然后在子类中简单地覆盖它(不使用new关键字),

public class Parent{
    [ApiMember(Name = "parentItem")]
    public virtual string Item {get; set;}
}

public class Child : Parent {
    [ApiMember(Name = "childItem")]
    public override string Item {get; set;}
}