Добавление nameof в C # через бэкдоры - PullRequest
1 голос
/ 13 октября 2010

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

Как сделать тип привязки данных безопасным и поддерживать рефакторинг

Однако я обеспокоен производительностью этого решения и намного большим набором текста - каждый раз, когда вы хотите использовать имя, вы должны вводить лямбду. Поэтому я думаю о более грубом методе - написании имени функции и внешней программы, которые изменят каждый файл .cs перед его компиляцией.

public string nameof<T>(T obj,string name = null)
{
  return name;
}

Вы бы использовали это таким образом

nameof(the_object.MyProperty);

Ключ находится во внешней программе, помогающей nameof - он будет искать любой вызов nameof и просто заменяет

nameof(X.Y.Z)

или

nameof(X.Y.Z,"s")

в

nameof(X.Y.Z,"Z")

Мой вопрос - какие ограничения, подводные камни такого подхода вы видите? Или, может быть .Net 5.0 со встроенным nameof будет выпущен на следующей неделе, так что нет смысла начинать писать программу для него? ; -)

Заранее благодарим за ваши мысли, рекомендации и т. Д.

1 Ответ

3 голосов
/ 13 октября 2010

Любые изменения в коде перед компиляцией были бы чрезвычайно хлопотными. Так что я бы избежал этого.

Я бы не стал сильно беспокоиться о производительности - в большинстве случаев, когда вам нужно имя свойства в виде строки, вы в конечном итоге все равно будете выполнять рефлексию или ввод-вывод, поэтому производительность все равно будет относительно низкой.

Вот что я предлагаю использовать:

public static string ToPropertyName<T>(this Expression<Func<T>> @this)
{
    var @return = string.Empty;
    if (@this != null)
    {
        var memberExpression = @this.Body as MemberExpression;
        if (memberExpression != null)
        {
            @return = memberExpression.Member.Name;
        }
    }
    return @return;
}

Теперь вы можете сделать это:

Expression<Func<T>> px = x => x.Foo;
var pn = px.ToPropertyName(); // == "Foo"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...