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 に答える