Возможно ли иметь шаблон get /setter в C#?

Я хочу применить это:

private string _name;

public string name
{
    get { return _name; }
    set { _name = Fix(value); }
}

чтобы все строки члены класса, и не хотите повторять один и тот же код для всех членов класса.

Очевидным решением будет поместить этот код в класс для решения проблемы и объявить все строковые члены как: myString вместо stringОднако это означало бы, что мне нужно было бы получить доступ к основным членам класса следующим образом: email.fixed вместо просто email,

Поэтому мне было интересно, есть ли какой-то шаблон, который я могу определить, а затем легко применить?

4 ответа

Вы можете создать фрагмент кода для Visual Studio, чтобы обрабатывать создание свойства таким образом.

MSDN включает документацию по созданию фрагмента кода, которая может включать параметры замены (имя).

Возможно, вы захотите исследовать Аспектно-ориентированное программирование, которое позволяет вам легко делать такие вещи.

http://www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostS

Создать тип с неявным преобразованием в и из string:

public class FixedString
{
    private string str;
    public FixedString(string str){this.str = str;}
    public static implicit operator FixedString(string str)
    {
        return new FixedString(Fix(str));
    }
    public static implicit operator string(FixedString fixed)
    {
        return fixed.str;
    }
}

Теперь вы можете создать свойство этого типа, но обрабатывать его как строку.

Создайте регулярное выражение для замены и используйте функциональность Visual Studio (v2012/2013) для поиска и замены регулярного выражения.

Например, скажем, у вас есть field как это, чтобы изменить в собственность

public string Name;

и вы хотите изменить его, чтобы иметь поле поддержки и установщик, который вы желаете.

private string _Name;

public string Name 
{
   get { return _Name; }
   set { _Name = Fix(value); }
}

Шаблон поиска / замены регулярных выражений в Visual Studio, чтобы найти это

public\s+string\s([^;]+);

шаблон замены (с соответствующими межстрочными интервалами и вкладками)

private string _$1;\r\n\r\n\tpublic string $1\r\n\t{\r\n\t\tget\r\n\t\t\t{ return _$1; }\r\n\t\tset\r\n\t\t\t{\r\n\t\t\t\t_$1 = Fix(value);\r\n\t\t\t}\r\n\t\t}

Затем пройдитесь по находкам и сделайте замену по мере необходимости в вашем классе.

Я сделал подобное, чтобы добавить вызовы метода INotifyChange к пустым свойствам, созданным после выполнения фрагмента кода. <tab><tab>prop действие.

Другие вопросы по тегам