我有一个基类:
class MyBase
{
public int Id { get; set; }
public string CreatedBy { get; set; }
public DateTime CreateAt { get; set; }
}
有一个子类具有从基类继承的readonly属性:
class MySub : MyBase
{
public string CreateAtStr{
get { return CreateAt.ToString("yyyy-MMM-dd", CultureInfo.InvariantCulture); }
}
}
我只能获得MyBase类型的结果,我希望它们自动转换为MySub类型。 怎么做? BTW:基类是实体类,子类是视图,因此需要进行一些自定义。
答案 0 :(得分:4)
您不能将基类转换为派生类,OOP不会涵盖这种情况(仅仅因为基类实例不是派生类实例)。
另一方面,您可以创建MySub
的新实例,然后使用AutoMapper之类的映射工具(或手动执行)来复制所有基本属性的值。
即手动复制:
List<MyBase> items = ...
List<MySub> subs = items.Select( x=> new MySub()
{
Id = x.Id,
CreatedBy = x.CreatedBy,
CreatedAt = x.CreatedAt
})
.ToList();
修改强>
在您的特定情况下(仅使用基类的现有公共属性),如果您不介意使用方法而不是属性,则替代方法可能是扩展方法:
public static class FooExtensions
{
public static string CreateAtStr(this MyBase myBase)
{
return myBase.CreateAt.ToString("yyyy-MMM-dd", CultureInfo.InvariantCulture);
}
}
现在您根本不需要派生类,只需在CreateAtStr()
类型的实例上调用MyBase
:
MyBase myBase = new MyBase();
string createdAt = myBase.CreateAtStr();