对于对象序列化我为每个对象创建了一个DataTransferObject-Pendant。每个原始对象都有一个ToDTO()方法,该方法返回具有要保存属性的相应DTO-Object。我的大多数原始对象都是从另一个继承的,所以我希望每个继承级别都能够关注自己的属性。一个简单的例子:
class base
{
private string _name;
public DTO_base ToDTO()
{
DTO_base result = new DTO_base();
result.Name = _name;
return result;
}
}
继承的类应该重写ToDTO()方法,调用parents方法并添加自己要保存的属性,如:
class inherited : base
{
private string _description;
public new DTO_inherited ToDTO()
{
DTO_inherited result = base.ToDTO();
result.Description = _description;
return result;
}
}
显然,这不会起作用,因为base.ToDTO()返回一个DTO_base对象。任何人都可以建议,如何最好地实现此功能?
提前致谢,
弗兰克
答案 0 :(得分:5)
如果您真的想在业务对象中使用DTO创建逻辑,我会采用通用方法。
class Base<TDTO> where TDTO : BaseDTO, new()
{
private string _name;
public TDTO ToDTO()
{
TDTO dto = new TDTO();
SetupDTO(dto);
return dto;
}
protected virtual void SetupDTO(TDTO dto)
{
dto.Name = _name;
}
}
class Inherited : Base<InheritedDTO>
{
private string _description;
protected override void SetupDTO(TDTO dto)
{
base.SetupDTO(dto);
dto.Description = _description;
}
}
答案 1 :(得分:3)
我会使用Template Method:
class baseCls
{
private string _name;
public DTO_base ToDTO()
{
DTO_base result = createDTO();
result.Name = _name;
setAdditionalData(result);
return result;
}
protected abstract DTO_base createDTO();
protected abstract void setAdditionalData(DTO_base dto);
}
class inherited : baseCls
{
private string _description;
protected override DTO_base createDTO() {
return new DTO_inerited();
}
protected override void setAdditionalData(DTO_base dto) {
inherited i = (DTO_inherited)dto;
i.Description = _Description;
}
}