Делегирование свойств в C#

256
28 мая 2018, 09:30

Допустим, есть класс с неким свойством:

class C {
    public int property { set; get; }
}

Хочу в другом классе прокинуть это свойство через член класса. Очевидное решение такое:

class D {
    private C c = new C();
    public int property {
         set { c.property = value; }
         get { return c.property; }
    }
}

Есть ли какой-то упрощенный синтаксис для этого?

Условно:

public int property => c;

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

Answer 1

Такого делегирования нет.

  1. Если нужно вытащить все свойства вложенного объекта, то у вас два пути:

    1. Предоставить доступ к вложенному объекту напрямую через свойство. Контроль вы теряете, зато код будет чистым.

    2. Унаследоваться от вложенного объекта. Часто это совершенно некорректно (следите за соблюдением отношения is-a), но с точки зрения языка вы получаете требуемое поведение. Контроля нет, архитектура сомнительная, зато сато самый краткий вариант.

  2. Если нужно вытащить некоторые свойства, при этом всё остальное важно скрыть, то есть следующие варианты:

    1. Не полениться и сделать всё вручную. Упрощённый синтаксис из C# 7 вам уже подсказали. Этот подход даёт максимальный контроль над безопасностью и архитектурой, но этот вариант самый многословный.

    2. Выделить необходимые свойства в интерфейс, реализовать его во вложенном объекте, предоставить наружу объект в виде интерфейса. Контроль достаточный (можно привести тип, но это уже на совести приводящего), архитектура и синтаксис разумные, чистота кода средненькая. Самый компромиссный вариант. Из минусов — требуется доступ к классу вложенного объекта, потому что extension everything до сих пор нет.

Answer 2

Класс можно написать вот так

class D
{
    private C c = new C();
    public int property
    {
        set => c.property = value;  
        get => c.property;
    }
}

Вот такие выражения set => c.property = value; называются Expression-bodied function members и появились в C# 6 версии.

READ ALSO
Как создавать объект по нажатию кнопки

Как создавать объект по нажатию кнопки

Как заставить прописанный мной объект для игры, создаваться только после нажатие игроком на кнопку 'Играть'Я не смог разобраться в instance, а opacity...

222
почему у меня выходит stackoverflow exception

почему у меня выходит stackoverflow exception

почему у меня выходит Stackoverflow exception, при попытке применения метода RotateLeft() для экземпляра класса BinarySearchTree А? Проблема именно в этом методе,...

195
Запись List<string> в List<List<string>>

Запись List<string> в List<List<string>>

Всем приветЕсть текст, как сделать так, чтобы он записался в List<List<string>>,где List<List<string>> - Предложение, а List<string> - Слова?

164
Актуальность WPF

Актуальность WPF

Подскажите, актуален ли сейчас WPF, как фреймворк для написания настольных приложений или есть что-то более стильное, модное и молодежное?

260