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

1

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

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

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

В некотором контексте:

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

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

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

Используя StackTrace (в С# 4.0) и CallerMemberName (в С# 5.0), я смог обновить свой код:

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

Теперь моя цель состоит в том, чтобы заархивировать следующее:

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

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

Теги:
callermembername

1 ответ

2
Лучший ответ

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

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

Теперь моя цель состоит в том, чтобы заархивировать следующее:

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

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

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

Опции:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню