Можно ли получить имя переменной (не значение) свойства с помощью отражения? - PullRequest
0 голосов
/ 27 августа 2018

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

У меня есть три класса

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)», а затем вызывал бы и этот метод, и реквизит из-за избыточности. Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 28 августа 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

0 голосов
/ 27 августа 2018

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

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

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

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

...