簡體   English   中英

如何從派生類中只獲取基類屬性?

[英]How to get only base class properties from derived class?

我的代碼是這樣的

public class BaseClass
{
    public string Field1 { get; set; }
}

public class DerivedClass: BaseClass
{
    public string Field2 { get; set; }
}

var obj = new DerivedClass { Field1 = "aaa", Field2 = "bbb" };

我必須序列化obj但我只需要BaseClass屬性,因為DerivedClass屬性是反序列化后添加的“附加信息”。

我怎么能得到它們? (我不能使用[JSonIgnore]裝飾器,因為我必須通過websocket發送DerivedClass對象,我將丟失信息)

您可以定義一個自定義合約解析程序,它將過濾掉所有DerivedClass屬性:

public class NoDerivedContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);
        property.ShouldSerialize = _ => property.DeclaringType != typeof(DerivedClass);
        return property;
    }
}

// .................

var obj = new DerivedClass { Field1 = "aaa", Field2 = "bbb" };
var json = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { 
    ContractResolver = new NoDerivedContractResolver() 
});
Console.WriteLine(json);

// Output:
//    {"Field1":"aaa"}

演示: https//dotnetfiddle.net/Qailvp

您可以為BaseClass提供一個構造函數,該構造函數將BaseClass作為參數並獲取必要的信息。 這樣您就可以創建一個新對象並將其序列化:

public class BaseClass
{
    public string Field1 { get; set; }

    public BaseClass(){ }
    public BaseClass(BaseClass dc)
    {
        this.Field1 = dc.Field1;
    }
}

public class DerivedClass : BaseClass
{
    public string Field2 { get; set; }
}

這樣稱呼它:

var obj = new DerivedClass { Field1 = "aaa", Field2 = "bbb" };

BaseClass obj_base = new BaseClass(obj);

你不能映射包含所有數據序列化的第三個類,如下所示:

public class BaseClass
{
    public string Field1 { get; set; }
}

public class DerivedClass: BaseClass
{
    public string Field2 { get; set; }
}

public class BaseClassDTO{
    public string Field1 { get; set; }
    public BaseClassDTO(BaseClass baseClass){
        this.Field1 = baseClass.Field1;
    }
}

有人建議( https://github.com/quozd/awesome-dotnet#object-to-object-mapping )。 但我擔心配置會因您的需要而變得復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM