一、问题
现有两个类,基类:
/// <summary>
/// 基类
/// </summary>
public class Model
{
public int Id { get; set; }
...
}
派生类:
/// <summary>
/// 派生类
/// </summary>
public class ForkModel : Model
{
public string ForkName { get; set; }
...
}
现在有个需求:将基类的数据传递给派生类,派生类中的ForkName再单独赋值。
在网上查找的方法比较简单粗暴:
var model = new Model(){};
model = GetModelData(); // 获取model数据
var forkModel = (ForkModel)model; // 强转
forkModel.ForkName = "Name";
但是,我这边测试都是报错的,报错内容是“无法将类型为Model的对象强制转换为类型ForkModel”。
二、解决方案
所以只能重新想办法,直接写个方法:
/// <summary>
/// 基类数据传给派生类
/// </summary>
/// <param name="destination">目的地(派生类)</param>
/// <param name="source">源(基类)</param>
public void AssignFrom(object destination, object source)
{
var destType = destination.GetType();
var sourceType = source.GetType();
var matchingProps = from d in destType.GetProperties()
join s in sourceType.GetProperties()
on d.Name equals s.Name
select new
{
source = s,
destination = d
};
foreach (var prop in matchingProps)
{
prop.destination.SetValue(destination, prop.source.GetValue(source, null), null);
}
}
然后直接使用方法即可:
var model = new Model(){};
model = GetModelData(); // 获取model数据
var forkModel = new ForkModel()
{
ForkName = "Name"
}
AssignFrom(forkModel, model);
测试通过,完结撒盐!