[英]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"}
您可以為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.