从其基类实例自动创建子类实例

时间:2011-08-24 02:18:18

标签: c# .net

我有一个基类:

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:基类是实体类,子类是视图,因此需要进行一些自定义。

1 个答案:

答案 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();