Реализация атрибута с похожим поведением для CompilerServices.CallerMemberAttribute

Можно создать атрибут, который имеет поведение, подобное CallerMemberNameAttribute?

Я имею в виду, я гуглил и нашел эту статью, в которой говорится, что CallerMemberName является атрибутом, принадлежащим группе CompilerServices, или, другими словами, эти атрибуты изменяют способ, которым компилятор будет строить мой IL. Поэтому невозможно воспроизвести это поведение без настройки компилятора C#.

Но я еще не убежден. У меня есть некоторая надежда, что кто-то в stackru может сказать иначе. Так что этот вопрос для него.

Некоторый контекст:

Я ищу это в основном для улучшения этого кода:

public int Prop
{
    { get { return (int)this["prop"]; }
    { set { this["prop"] = value; }
}

У меня есть много классов в моем приложении, которое является словарем и имеет свойство, которое представляет определенный ключ.

С помощью StackTrace (в C# 4.0) и CallerMemberName (в C# 5.0) я смог обновить свой код до этого:

public int Prop
{
    { get { return Get(); }
    { set { Set(value); }
}

Теперь моя цель - заархивировать примерно так:

public int Prop { { [DicGet]get; [DicSet]set; } }

Так может кто-нибудь мне помочь? Возможно?

1 ответ

Решение

Можно создать атрибут, который имеет поведение, похожее на CallerMemberNameAttribute?

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

Теперь моя цель - заархивировать примерно так:

public int Prop { { [DicGet]get; [DicSet]set; } }

Так может кто-нибудь мне помочь? Возможно?

Не из коробки, нет.

Опции:

  • Измените компилятор Roslyn (теперь он с открытым исходным кодом) - хотя я бы не рекомендовал этого.
  • Используйте PostSharp
  • Используйте какой-то препроцессор перед компиляцией
  • Вместо этого используйте динамическую типизацию (например, расширение DynamicObject и обрабатывать доступ к свойствам таким образом)
Другие вопросы по тегам