Получить имя экземпляра С#
Возможно, этот вопрос глуп, но в моей конкретной ситуации я хочу получить имя экземпляра, поэтому я имею в виду:
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;
}
}