c# 父类向子类转化的一种方法

发布时间 2023-12-19 04:15:32作者: xiaoyifan2023

在使用sqllite的时候,将数据库的字段反序列化的功能非常好用,但是在如果一个子类继承父类之后,从父类来得模板数据需要映射到子类上再进行数据储存就变得没有办法了,因此寻找解决办法

子类可以通过as或者强制转化为父类,但是反向转化会导致属性丢失

如果给子类添加构造函数的转换父类,效率非常低,且无扩展性,后续维护非常麻烦

如果通过第三方工具,比如AutoMapper,需要引入第三方库,且为了一个小小的实现,需要引入巨大的库对整个软件都是巨大的开销

这里给出第三种办法,使用反射将父类属性映射到子类属性

属性和字段需要分开映射,这属于不同的两个东西

public class Tools<T>
{/// <summary>
    /// 利用反射解决 从父类向子类扩展的方法
    /// 作用域 属性
    /// </summary>
    /// <param name="parentInstance"></param>
    /// <param name="childInstance"></param>
    /// <returns></returns>
    public static T Propertiemap(object parentInstance, T childInstance)
    {
        var parentFields = parentInstance.GetType().GetProperties();
        var childFields = childInstance.GetType().GetProperties();

        // Map parent class fields to child class fields
        foreach (var parentField in parentFields)
        {
            var childField = childFields.FirstOrDefault(f => f.Name == parentField.Name);
            Debug.Log(parentField.Name);
            if (childField != null)
            {
                Debug.Log(parentField.GetValue(parentInstance));
                childField.SetValue(childInstance, parentField.GetValue(parentInstance));
            }
        }
        return childInstance;
    }

    /// <summary>
    /// 利用反射解决 从父类向子类扩展的方法
    /// 作用域 字段
    /// </summary>
    /// <param name="parentInstance"></param>
    /// <param name="childInstance"></param>
    /// <returns></returns>
    public static T Attributemap(object parentInstance, T childInstance)
    {
        var parentFields = parentInstance.GetType().GetFields();
        var childFields = childInstance.GetType().GetFields();

        // Map parent class fields to child class fields
        foreach (var parentField in parentFields)
        {
            var childField = childFields.FirstOrDefault(f => f.Name == parentField.Name);
            if (childField != null)
            {
                childField.SetValue(childInstance, parentField.GetValue(parentInstance));
            }
        }
        return childInstance;
    }


}

 

 

同样的,如果需要映射方法也可以使用相同的办法,但是注意由于使用了反射,相比赋值速度上会慢1000倍,进行大规模转化可能会导致效率极低

 

转载请注明来源