Реализация атрибута с похожим поведением для 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
и обрабатывать доступ к свойствам таким образом)