Можно ли получить имя переменной (не значение) свойства с помощью отражения?

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

У меня задействовано три класса

A:

class A 
{
    public B bObject;

    int Number { return bObject.number; } //returns 3
}

B:

class B 
{   
    public int number = 3; 
}

C:

class C 
{
    public void myMethod() 
    {
        A aObject = new A();

        var aNumber = aObject
            .GetType()
            .GetProperty("Number")
            .GetValue(aObject, null);

        //this is the value. aNumber = 3.
        var objName = nameof(aNumber); //returns aNumber
    }

Я хочу, чтобы objName возвращал строку "bObject.number", переменную, которая была вызвана внутри свойства. Возможно ли это с моей текущей настройкой, и если нет, есть ли у кого-нибудь рекомендации?

Я бы предпочел, чтобы в B не было другого метода, возвращающего «nameof (bObject) + nameof (bObject.number)», а затем вызывающего как этот метод, так и опору из-за избыточности. Спасибо за ваше время.


person Wen    schedule 27.08.2018    source источник
comment
Я бы спросил Почему? Но вопрос интересный...   -  person Grantly    schedule 27.08.2018
comment
Написание модуля в соответствии со сторонними спецификациями, для которого требуется, чтобы каждый атрибут имел какой-либо тег. Модель настроена так, что тег каждого реквизита также равен имени bObject. Возможно, здесь есть большая проблема дизайна!   -  person Wen    schedule 27.08.2018
comment
Я хочу, чтобы objName возвращал строку bObject.number, переменную, которая была вызвана внутри свойства. Я не верю, что это возможно. По сути, вы пытаетесь извлечь имя из строки кода, которая вернула значение.   -  person stuartd    schedule 27.08.2018
comment
Что происходит, когда компилятор оптимизирует его только до int Number => 3;? Проверку кода лучше всего оставить для инструментов, которые работают в IDE, если вы хотите это сделать, я бы посоветовал взглянуть на плагины VS и анализаторы кода Rosyln.   -  person Ron Beyer    schedule 27.08.2018
comment
@stuartd он был инициализирован правильно? нет причин, по которым он недоступен   -  person JanWillem Huising    schedule 27.08.2018
comment
@JanWillemHuising На самом деле, если вы взяли приведенный выше код как есть, он выдаст NullReferenceException, потому что он не инициализирован. Даже если бы это было так, переменная может быть оптимизирована и, возможно, искажена при работе в режиме Release.   -  person Ron Beyer    schedule 27.08.2018
comment
@JanWillemHuising A был инициализирован, но bObject по-прежнему имеет значение null и должен быть инициализирован в конструкторе A.   -  person Neil    schedule 28.08.2018


Ответы (2)


Здесь вы пытаетесь получить тело метода Number, а затем удалить «return» и «;» чтобы получить только то значение, которое вы хотите.

Здесь есть очень хороший пример, который показывает, как получить тело метода в виде строки: Получение исходного кода определенного метода из файла .cs (во время выполнения)

Когда это будет сделано, вы можете просто проанализировать «возврат» и «;» чтобы получить то, что вы хотите.

Это не очень элегантно, но делает то, что вы хотите.

person Maxime Tremblay-Savard    schedule 27.08.2018

Вы можете определить пользовательский атрибут и хранить в нем такие строки, как «bObject.number». Затем значения атрибутов также доступны через отражение. https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/concepts/attributes/creating-custom-attributes

Если вы считаете, что писать один и тот же код дважды слишком дорого, взгляните на шаблоны T4 https://msdn.microsoft.com/ru-ru/library/bb126445.aspx

person Azamat Suleymanov    schedule 27.08.2018