假设我有3个班级。
public Class1{
public string field1{get;set;}
}
public Class2:Class1 {
public string field2{get;set;}
}
public Class3:Class2 {
public string field3{get;set;}
}
Class3 obj3 = new Class3();
Class2 obj2 = obj3;
Class1 obj1 = obj2;
public class MyInfoService : ServiceBase<MyReuest>
{
protected override object Run(MyReuest request)
{
Class3 obj3= FindObjClass3("someid");
Class2 obj2 = DoSomethingObj3Class3(obj3);
Class1 obj1= obj2; // service users have to get only Class1 fields
return obj1;
}
}
当我想将obj1作为响应返回格式= json时,问题开始,输出json包含来自obj2和obj3的属性。
我只是想将obj1序列化为仅响应其属性。
有办法做到这一点吗?
答案 0 :(得分:2)
不要试图滥用继承,这对DTO来说是不好的做法: Getting ServiceStack to retain type information
将继承用于DRY属性也是一个坏主意 - 应该避免这些不必要的抽象。自动属性是表达类型的结构字段的简洁方法。在需要时使用接口: http://ayende.com/blog/4769/code-review-guidelines-avoid-inheritance-for-properties
答案 1 :(得分:1)
如果无法触及序列化级别,请在返回前尝试克隆对象。
public class Class1 : ICloneable {
public string Prop1 { get; set; }
public object Clone() {
return new Class1 { Prop1 = Prop1 };
}
}
public class Class2 : Class1 {
public string Prop2 { get; set; }
public new object Clone() {
return new Class2 { Prop1 = Prop1, Prop2 = Prop2 };
}
}
然后使用:
public class MyInfoService : ServiceBase<MyReuest>
{
protected override object Run(MyReuest request)
{
Class3 obj3 = FindObjClass3("someid");
Class2 obj2 = DoSomethingObj3Class3(obj3);
return ((Class1) obj2).Clone();
}
}
注意:对于Clone方法的不同实现,取决于类型使用new
关键字而不是override