从从属对象中提取基对象

本文关键字:对象 提取 | 更新日期: 2023-09-27 18:14:24

我有一个基类和一个从属类。

class A
{
   ...
}
class B : A
{
   ...
}

我如何从依赖类中提取基类的对象?

B myDependant = new B();
A myBase = (A) myDependant; 

(A)类型是可选的,但myBase对象仍然是B类型。我想让myBase的类型为A,而不创建一个新的对象。

从从属对象中提取基对象

好吧,你可以创建自己的契约解析器来检查属性是否属于某种类型,如果不是,它会将其标记为忽略:

class MyContractResolver<T> : DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var list = base.CreateProperties(type, memberSerialization);
        var baseProps = typeof(T).GetProperties();
        foreach (var prop in list)
        {
            prop.Ignored = baseProps?.All(p => p.Name != prop.PropertyName) ?? false;
        }
        return list;
    }
}

并使用它:

var myDependant = new B();
var settings = new JsonSerializerSettings() { ContractResolver = new MyContractResolver<A>() };
var json = JsonConvert.SerializeObject(myDependant, settings);

这里的优点是你的类只会被序列化一次,缺点是如果A继承了其他类,它的属性也会被序列化。

根据您的上一个评论,您可以这样做:

B myDependant = new B();
A myBase = JsonConvert.DeserializeObject<A>(JsonConvert.SerializeObject(myDependant));

这样,myBase将成为A类的一个实例。