Каскадные методы расширения для нескольких интерфейсов? - PullRequest
2 голосов
/ 25 января 2012

У меня есть несколько интерфейсов, которые могут реализовать мои объекты.Мне интересно, есть ли способ «каскадировать» один метод расширения в другой, используя то же имя метода.Я могу смотреть на все это неправильно, но вот пример:

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)

        }

Ответы [ 3 ]

1 голос
/ 25 января 2012

Да, вы можете ..... просто приведите к нужному интерфейсу ...

например

 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 голос
/ 25 января 2012

Как это?

public static class Helper
{
    public static void ToEntity(this MeetingDto source)
    {
        Console.WriteLine ("MeetingDto.ToEntity");
        //Do Stuff
        (source as IDocumentDto).ToEntity();
    }

    public static void ToEntity(this ContactDto source)
    {
        Console.WriteLine ("ContactDto.ToEntity");
        //Do Stuff
        (source as IBaseDto).ToEntity();
    }

    public static void ToEntity(this IDocumentDto source)
    {
        Console.WriteLine ("IDocumentDto.ToEntity");
        //Do Stuff
        foreach (var element in source.Subscriptions)
        {
            element.ToEntity();
        }
    }

    public static void ToEntity(this IBaseDto source)
    {
        Console.WriteLine ("IBaseDto.ToEntity");
        //Do Stuff        
    }
}
0 голосов
/ 25 января 2012

Методы расширения являются статическими, и поэтому они не могут быть переопределены с помощью наследования.

Если вы хотите, чтобы он применялся к каждому элементу, почему бы просто не использовать оба интерфейса для реализации третьего интерфейса с вашим методом ToEntity?

Если вы не можете изменить эти классы, подумайте о чем-то похожем на интерфейс IConverer.Иметь интерфейс с методом, который принимает ... что-то и возвращает сущность.(Это может быть универсальным.) Таким образом, вы отделяете код для преобразования каждого из этих типов в сущности, так же, как если бы вы использовали методы расширения.

...