Инструмент для генерации реализации интерфейса делегированием?

2

Мне часто нужно реализовать интерфейс, делегируя реализацию члену моего класса. Эта задача довольно утомительна, потому что, хотя Visual Studio создает заглушки для методов интерфейса, мне все же приходится писать код для делегирования реализации. Это не требует много размышлений, поэтому его можно, вероятно, автоматизировать с помощью инструмента генерации кода...

Я, вероятно, не первый, кто думает об этом, поэтому должен быть такой инструмент уже, но я не мог найти что-либо в Google... Любая идея?


EDIT: кажется, что ReSharper может это сделать, но это довольно дорого... есть ли бесплатная альтернатива с той же функцией?

  • 0
    Ах, декоратор экстракта. Я собирался сделать это в Coderush целую вечность - так и не нашел время. Я был бы заинтересован в ответах на это.
Теги:
interface
code-generation
delegation

3 ответа

2
Лучший ответ

Я использую Resharper в течение нескольких месяцев, и у него есть отличная возможность для этого.

Например, напишите следующий код:

class MyList<T> : IList<T>
{
    private readonly IList<T> _list;
}

Поместите курсор на _list, нажмите Alt + Ins (ярлык для создания кода) и выберите "Делегировать участников". Выберите членов, которые вам нужны, и R # создает для них делегирование:

    public void Add(T item)
    {
        _list.Add(item);
    }

    public void Clear()
    {
        _list.Clear();
    }

    public bool Contains(T item)
    {
        return _list.Contains(item);
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        _list.CopyTo(array, arrayIndex);
    }

    public bool Remove(T item)
    {
        return _list.Remove(item);
    }

    public int Count
    {
        get { return _list.Count; }
    }

    public bool IsReadOnly
    {
        get { return _list.IsReadOnly; }
    }

    public int IndexOf(T item)
    {
        return _list.IndexOf(item);
    }

    public void Insert(int index, T item)
    {
        _list.Insert(index, item);
    }

    public void RemoveAt(int index)
    {
        _list.RemoveAt(index);
    }

    public T this[int index]
    {
        get { return _list[index]; }
        set { _list[index] = value; }
    }
1

Вы можете попробовать следующее: http://www.codeproject.com/KB/codegen/decorators.aspx?display=PrintAll&fid=1532149&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2837870

  • 0
    Спасибо за ответ! Этот инструмент выглядит красиво, но он позволяет применять этот шаблон только для типов в одном проекте. Мне нужно сделать это для типов BCL (обычно ICollection<T> или IDictionary<K,V> )
0

... см. динамический прокси...

Однако...

Возможность делегирования реализации интерфейса переменной экземпляра или типу [как в typeof (type)] является очень необходимой языковой функцией С# и VB.Net. При отсутствии множественного наследования и распространенности запечатанных и не виртуальных методов и свойств количество требуемого кода пуха является сложным.

Я бы подумал, что дальнейшее улучшение языка будет работать...   // С#

interface IY_1
{
  int Y1;
  int Y2;
}
...
..
interface IY_n
{
....
..
}


class Y : IY_1, IY_2, ....,IY_n
{
  private readonly Oy_1 Oy_1 = new Oy_1() supports IY_1, IY_2,...etc;   // <<-----
  private readonly Oy_2 Oy_2 = new Oy_2() supports IY_3, IY_8,...etc;
  public int Y2 {...}
}

Ключевое слово "поддерживает" (или эквивалент, такое как "defaults" ) идентифицирует упорядоченный список значений полей класса, которые "помогают" в реализации одного или нескольких интерфейсов, используя семантику стандартного имени и подписи сигнатур интерфейса имя и подпись. Любая локальная реализация имеет приоритет, и, кроме того, один интерфейс может быть реализован несколькими значениями поля.

  • 0
    Я согласен, что это была бы интересная особенность ... но я не уверен, что MS сочтет это достаточно полезным, чтобы сделать это на языке

Ещё вопросы

Сообщество Overcoder
Наверх
Меню