вывести имя переменной в c # - PullRequest
9 голосов
/ 08 апреля 2009

У меня есть заявление

int A = 10,B=6,C=5;

и я хочу написать функцию печати так, чтобы я передал ей переменную int и он печатает мне имя переменной и значение.

например, если я позвоню печати (A) он должен вернуть «A: 10» и напечатать (B), затем он должен вернуть «B: 6»

Короче говоря, я хочу знать, как я могу получить доступ к имени переменной и распечатать его в строку в C #. Должен ли я использовать отражение?

После прочтения ответов

Привет всем, спасибо за предоставленные предложения. Я попробую их, однако я хотел бы знать, возможно ли это в .NET 2.0? Ничего подобного

#define prt(x) std::cout << #x " = '" << x << "'" << std::endl;

макрос, который есть в C / C ++?

Ответы [ 6 ]

25 голосов
/ 08 апреля 2009

Единственный разумный способ сделать это - использовать Expression API; но это еще больше меняет код ...

static void Main() {
    int A = 10, B = 6, C = 5;
    Print(() => A);
}
static void Print<T>(Expression<Func<T>> expression) {
    Console.WriteLine("{0}={1}",
        ((MemberExpression)expression.Body).Member.Name,
        expression.Compile()());
}

Примечание: если это для целей отладки, обязательно добавьте [Conditional("DEBUG")] к методу, так как использование переменной таким образом изменяет природу кода тонкими способами.

7 голосов
/ 08 апреля 2009

Вы можете использовать лямбда-выражения:

static void Main( string[] args ) {
    int A = 50, B = 30, C = 17;
    Print( () => A );
    Print( () => B );
    Print( () => C );
}

static void Print<T>( System.Linq.Expressions.Expression<Func<T>> input ) {
    System.Linq.Expressions.LambdaExpression lambda = (System.Linq.Expressions.LambdaExpression)input;
    System.Linq.Expressions.MemberExpression member = (System.Linq.Expressions.MemberExpression)lambda.Body;

    var result = input.Compile()();
    Console.WriteLine( "{0}: {1}", member.Member.Name, result );
}
5 голосов
/ 08 апреля 2009

Это невозможно без некоторой «помощи» с сайта вызова; четное отражение не знает об именах локальных переменных.

2 голосов
/ 10 декабря 2009

Другое решение (из закрытого сообщения ):

Вдохновленный постом Джона Скита об обработке исключений Null Reference, и внезапное напоминание о проекции есть способ сделать это.

Вот полный рабочий кодез:

public static class ObjectExtensions {
    public static string GetVariableName<T>(this T obj) {
        System.Reflection.PropertyInfo[] objGetTypeGetProperties = obj.GetType().GetProperties();

        if(objGetTypeGetProperties.Length == 1)
            return objGetTypeGetProperties[0].Name;
        else
            throw new ArgumentException("object must contain one property");
    }
}

class Program {
    static void Main(string[] args) {
        string strName = "sdsd";
        Console.WriteLine(new {strName}.GetVariableName());

        int intName = 2343;
        Console.WriteLine(new { intName }.GetVariableName());
    }
}
2 голосов
/ 08 апреля 2009

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

print(42);
print(A + 42);

Ни одно из этих выражений на самом деле не имеет имени. Что бы вы ожидали напечатать здесь?

0 голосов
/ 08 августа 2015

Здесь, в будущем, мы просто используем оператор nameof.

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