Создать ExtensionMethod для ICollection, принимающего унаследованные типы коллекций - PullRequest
0 голосов
/ 15 октября 2018

Я создаю класс, который может принимать универсальный тип в качестве данных, и, в случае типа коллекции, я хотел бы создать метод расширения для добавления элементов внутри.К настоящему времени у меня есть следующий метод расширения:

public ActionResponseBuilder<ICollection<TElement>> AddElement<TElement>(this ActionResponseBuilder<ICollection<TElement>> builder, TElement element)
{
    //TODO Logic
    return builder;
}

Мой метод тестирования для этого:

var data = DateTime.Now;

var builtActionResponse = new ActionResponseBuilder<List<DateTime>>()
       .SetData(new List<DateTime> { data })
       .AddElement(data)
       .Build();

Но у меня появляется следующая ошибка:

Ошибка CS1929 «ActionResponseBuilder>» не содержит определения для «AddElement» и наилучшей перегрузки метода расширения «ActionResponseBuilderHelper.AddElement (ActionResponseBuilder>, DateTime)» требует приемник типа «ActionResponseBuilder>

* 1011»Если я изменю тип для метода расширения на List, он будет работать, но я хотел бы воспользоваться для этого преимуществом и возможностями наследования и обобщений:

Чего мне не хватает, могу ли я это сделать?Любая идея?

Заранее большое спасибо:)

PD : Эти вещи являются частью небольшого инструмента nuget, весь код, кроме этого новогореализацию можно найти в следующем репозитории GitHub:

EDIT : первоначально имяметод расширения был неправильно скопирован AddData -> AddElement, благодаря @ Fabjan

1 Ответ

0 голосов
/ 15 октября 2018

Вы можете изменить свой метод расширения, чтобы взять и T, и TElement, и ограничить T, чтобы сделать его ICollection:

public static class Extensions
{
    public static ActionResponseBuilder<T> AddData<T, TElement>(this ActionResponseBuilder<T> builder, TElement element) where T : ICollection<TElement>
    {
        // TODO: Logic

        return builder;
    }
}

Теперь вы можете ссылаться на него следующим образом:

ActionResponseBuilder<List<DateTime>> builder = new ActionResponseBuilder<List<DateTime>>()
    .AddData(DateTime.Now);
...