Есть ли хороший способ получить текущее имя свойства? - PullRequest
3 голосов
/ 10 апреля 2011

Я знаю, что есть способы, но есть ли на самом деле хороший способ?

На данный момент у меня есть достойная структура на основе атрибутов, которая работает очень хорошо, за исключением многословия:

public Variable<int> Value { get { return Get.Int(MethodBase.CurrentMethod()); } }

Представьте себе, * несколько сотен (часто с сеттерами тоже). Есть ли способ получить тот же результат, но более краткий?

Я считал:

public Variable<int> Value { get { return Get.Int("Value"); } }

и пробовал:

public Variable<int> Value { get { return Get.Int(() => Value); } }

Но так как многие из этих переменных (в этом безумии есть метод, я обещаю) меня беспокоят неясные ошибки, связанные со вторым значением (или строкой), не совпадающим с первым.

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

Мое любимое "решение" до сих пор было:

protected Func<MethodBase> Self = MethodBase.GetCurrentMethod;
public Variable<int> Value { get { return Get.Int(Self()); } }

Что коротко, мило и красиво смотреться.

Но, увы, JIT убивает правила как вариант. Есть ли способ, которым я могу переписать GetCurrentMethod в C #, под другим именем? Жаль, что StackCrawlMark (который, я считаю, необходим) является внутренним компонентом системы.

В качестве альтернативы, есть ли какие-либо инструменты, совместимые с ReSharper, но, возможно, я позволю мне просматривать код через очки, уменьшая многословный MethodBase.GetCurrentMethod до чего-то более короткого и сладкого, в то же время компилируя точно так же? (Я действительно предпочел бы, чтобы у меня не было шага предварительной компиляции, но я открыт для предложений - тот, который сводит все это к имени свойства, был бы хорош).

1 Ответ

0 голосов
/ 10 апреля 2011

Короче, нет.Существуют различные попытки сделать это, включая проверку стека (GetCurrentMethod) и лямбда-выражения, но в конечном итоге все они немного неэффективны.

Если вам не нужна запутывание, я просто использовал бы строку - Get.Int("Value")- маловероятно, что это будет реальной проблемой обслуживания.

Подход с проверкой стека страдает от потенциальной хрупкости, если он встроен;если вам нужно запутать, я бы, наверное, пошел с Expression.Или просто пометьте метод как «не запутывайте это имя».

Другой подход - иметь абстрактный базовый тип и использовать метапрограммирование для создания конкретного типа с правильными данными /код во время выполнения, основанный на проверке ваших атрибутов.

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