Получить имя экземпляра С#

Возможно, этот вопрос глуп, но в моей конкретной ситуации я хочу получить имя экземпляра, поэтому я имею в виду:

class Student
{
     private string name {get; private set;}

     public Student(string name) 
     {
         this.name = name 
     }

     public getInstanceName() 
     {
        //some function
     }

}

поэтому, когда я делаю ученика

   Student myStudent = new Student("John");

это глупо, но я хочу этого

 myStudent.getInstanceName(); // it should return 'myStudent'

Ответ 1

Теперь это возможно в С# 6.0:

Student myStudent = new Student("John");
var name = nameof(myStudent); // Returns "myStudent"

Это полезно для кодовых контрактов и регистрации ошибок, так как это означает, что если вы используете "myStudent" в своем сообщении об ошибке, а позже решили переименовать "myStudent", вы будете вынуждены компилятором изменить имя в сообщении как а не забыть об этом.

Ответ 2

Это невозможно в С#. Во время выполнения имена переменных даже не существуют, поскольку JIT удаляет информацию о символах.

Кроме того, переменная является ссылкой на экземпляр класса - несколько переменных могут ссылаться на один и тот же экземпляр, а на экземпляр могут ссылаться переменные разных имен на протяжении всего срока его службы.

Ответ 3

Этот вопрос очень старый, но ответ изменился с выпуском .Net Framework 4.6. Теперь существует оператор nameof(..), который можно использовать для получения строкового значения имени переменных во время компиляции.

Итак, для исходного вопроса C# nameof(myStudent) // returns "myStudent"

Ответ 4

Попробуйте

string result = Check(() => myStudent);

static string Check<T>(Expression<Func<T>> expr)
{
    var body = ((MemberExpression)expr.Body);
    return body.Member.Name;
}

или

GetName(new { myStudent });

static string GetName<T>(T item) where T : class 
{
  return typeof(T).GetProperties()[0].Name;
}

Ответ 5

Нет, это невозможно, потому что это совершенно смешно. Объект никогда не может, каким-либо образом, знать имя переменной, которой вы ее назначили. Представьте себе:

Student myStudent = new Student("John");
Student anotherStudent = myStudent;
Console.Write(anotherStudent.getInstanceName());

Должен ли он сказать myStudent или anotherStudent? Очевидно, это не имеет понятия. Или смешные ситуации:

School mySchool = new School("Harvard");
mySchool.enroll(new Student("John"));
Console.Write(mySchool.students[0].getInstanceName());

Я действительно хотел бы знать, что это будет печатать.

Ответ 6

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

var students = new Dictionary<string, Student>();
var students["myStudent"] = new Student("John");

// Find key of first student named John
var key = students.First(x => x.Value.Name == "John").Key; // "myStudent"

Ответ 7

Нет, но вы могли бы сделать это

var myStudent = new Student("John").Named("myStudent");
var nameOfInstance = myStudent.Name();

public static class ObjectExtensions
{
    private static Dictionary<object,string> namedInstances = new Dictionary<object, string>(); 

    public static T Named<T>(this T obj, string named)
    {
        if (namedInstances.ContainsKey(obj)) namedInstances[obj] = named;
        else namedInstances.Add(obj, named);
        return obj;
    }

    public static string Name<T>(this T obj)
    {
        if (namedInstances.ContainsKey(obj)) return namedInstances[obj];
        return obj.GetType().Name;
    }
}