2016-01-08 2 views
0

Рассмотрите такой сценарий, у вас есть некоторые данные, но вы не хотите раскрывать его напрямую, кроме того, есть какая-то логика. Так что вы пишете что-то вроде этого:Можно ли минимизировать шаблон обертки на однострочный?

private string field; 
public string Field 
{ 
    get { return this.field; } 
    set 
    { 
    // some logic with previous value 
    this.field = value; 
    // some logic with new value 
    } 
} 

Ok, прохладную, но как только вы пишете это для N-й раз у вас есть достаточно, чтобы вы пишете класс - оболочку для него. Поскольку вы не хотите подвергать реализации вы пишете это:

private Wrapper<string> field = new Wrapper<string>(); 
public string Field 
{ 
    get { return this.field.value;} 
    set { this.field.value = value; } 
} 

Так, хорошо, общий код скрыт, реализация не подвергается, но все еще есть много повторений.

Вопрос - можно ли его сжать?

Выше это мой главный вопрос о шаблоне в C#, но я оставляю это для комментариев - есть ли язык, который поддерживает этот шаблон в той степени, в которой требуется только одна строка. Что-то вроде этого:

public string Field { get; set; } <- new Wrapper<string>(); // pseudo code 
+0

Используйте фрагмент кода - очень удобно в вашем случае, и дешевле, чем на другом языке. – Fabio

+0

@Fabio, фрагменты AFAIK в порядке, когда ** создается ** код (запись), но как только они находятся в коде, вы должны обрабатывать их вручную. Таким образом, это не решение как таковое, это просто способ автоматизации ввода текста, а не для управления кодом в целом. – greenoldman

+0

Вы можете использовать фрагмент для «набора» вашего класса Wrapper. В этом случае ваша управляемая логика останется в одном месте -> в вашем классе-оболочке – Fabio

ответ

-1

Можно с C# 6.0

public string Field { get; } = new Field<string>(); 
+0

Это только геттер. Не обрабатывает настройку. – Sign

+0

Только свойства readonly, которые не изменяют базовое значение. – Fabio

+0

@Phani - можете ли вы объяснить, как этот ответ является «новым вопросом»? –

2

В C#, я полагаю, вы могли бы создать неявное преобразование между Wrapper<string> и string таким образом, что вы можете объявить:

public Wrapper<string> Field { get; set; } 

И затем назначьте строку в собственность:

MyObject.Field = "test string"; 

Подробнее о неявных конверсиях можно узнать здесь: implicit (C# Reference) или посмотреть на this answer for an example.

+0

Это хорошо! Спасибо, но если я не ошибаюсь при входящем преобразовании, оболочка будет создана снова, что означает необходимость повторной проводки (например, соединение с базой данных или что-то подобное). – greenoldman

+0

Конверсии только для набора и чтения всех значений станут проблемой производительности в будущем – Fabio

Смежные вопросы