多个接口的级联扩展方法?

时间:2012-01-24 21:07:57

标签: c# extension-methods

我的对象可以实现多个接口。我想知道是否有一种方法可以将一个扩展方法“级联”到另一个扩展方法,同时使用相同的方法名称。我可能会看到这一切都错了,但这是一个例子:

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)

        }

2 个答案:

答案 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接口的内容。拥有一个接口,其中包含一个带有...的方法,并返回一个实体。 (它可能是通用的。)通过这种方式,您可以将代码分离出来,将每种类型转换为实体,就像使用扩展方法一样。