我的对象可以实现多个接口。我想知道是否有一种方法可以将一个扩展方法“级联”到另一个扩展方法,同时使用相同的方法名称。我可能会看到这一切都错了,但这是一个例子:
public interface IBaseDto
{
int Id {get;set;}
string CreatedByFullName {get;set;}
}
public interface IDocumentDto
{
List<ContactDto> Subscriptions {get;set;}
}
public class ContactDto: IBaseDto
{
public int Id {get;set;}
public string CreatedByFullName {get;set;}
public string FirstName {get; set}
public string LastName {get;set;}
}
public class MeetingDto: IDocumentDto
{
public int Id {get;set;}
public string CreatedByFullName {get;set;}
public List<ContactDto> Subscriptions {get;set;}
}
所以,假设我想使用扩展方法将DTO转换为实体。一个例子是MeetingDto.ToEntity()
;
我正在考虑是否可以为IBaseDto
编写部分扩展方法,为IDocumentDto
编写另一个扩展方法,然后为每个具体实现编写自己的属性。当我致电MeetingDto.ToEntity()
时,它会首先点击会议扩展程序并调用IDocumentDto
版本,填写所需内容,然后IDocumentDto
会调用IBaseDto
。我希望这是有道理的。
更新
我提出了这个并且效果很好:
public static TBaseDto ToEntity<TBridgeDto>(this TBaseDto dto) where TBaseDto: IBaseDto
{
...
return dto;
}
public static TDocumentDto ToEntity<TDocumentDto>(this TDocumentDto dto, IDocumentDto currentDto) where TDocumentDto : IDocumentDto
{
...
return dto.ToEntity();
}
public static MeetingDto ToEntity(this RfiDto dto)
{
...
return dto.ToEntity(dto)
}
答案 0 :(得分:1)
是的,你可以.....只是投射到你想要的界面......
例如
interface I1
{
int Id { get; set; }
}
public interface I2
{
string Name { get; set; }
}
public class Blah : I1, I2
{
public int Id { get; set; }
public string Name { get; set; }
}
static class ExtendIt
{
public static void ToEntity(this I1 x)
{
x.Id = 1;
}
public static void ToEntity(this I2 x)
{
x.Name = "hello";
}
public static void ToEntity(this Blah x)
{
(x as I1).ToEntity();
(x as I2).ToEntity();
}
}
答案 1 :(得分:-1)
扩展方法是静态的,因此无法使用继承覆盖它们。
如果您希望它应用于每个元素,为什么不让两个接口都使用ToEntity方法实现第三个接口?
如果您无法修改这些类,请考虑类似于IConverer接口的内容。拥有一个接口,其中包含一个带有...的方法,并返回一个实体。 (它可能是通用的。)通过这种方式,您可以将代码分离出来,将每种类型转换为实体,就像使用扩展方法一样。