2

假设我有 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;

        }
}

当我想使用 format=json 返回 obj1 作为响应时,问题就开始了,输出 json 包含来自 obj2 和 obj3 的属性。

我只希望 obj1 仅以其属性序列化为响应。

有没有办法做到这一点 ?

4

2 回答 2

2

不要尝试滥用继承,它们对 DTO 来说是不好的做法: 让 ServiceStack 保留类型信息

对 DRY 属性使用继承也是一个坏主意——应该避免这些不必要的抽象。自动属性是一种简洁的方式来表达你的类型的结构字段。在需要时使用接口:http: //ayende.com/blog/4769/code-review-guidelines-avoid-inheritance-for-properties

于 2012-08-19T16:55:13.457 回答
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

于 2012-08-19T16:13:05.953 回答