расшифровка подписи переменной в c#

Однострочный подход для получения списка n различных случайных элементов. Random ничем не ограничен.

val list = mutableSetOf<Int>().let { while (it.size() < n) it += Random.nextInt(0, 100) }.toList()
9
задан Anirudh Goel 9 April 2009 в 04:27
поделиться

5 ответов

Единственный разумный способ сделать это - использовать 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")] к методу, так как в нем используется переменная способ изменяет природу кода тонкими способами.

26
ответ дан 4 December 2019 в 06:14
поделиться

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

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 );
}
7
ответ дан 4 December 2019 в 06:14
поделиться

This is not possible without some 'help' from the call site; even reflection does not know about names of local variables.

5
ответ дан 4 December 2019 в 06:14
поделиться

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

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

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

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

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

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

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

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

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

2
ответ дан 4 December 2019 в 06:14
поделиться

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

На основе сообщения Джона Скита об обработке исключений с нулевой ссылкой и внезапном напоминании о проецировании есть способ сделать это.

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

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
ответ дан 4 December 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: