Получение имени экземпляра экземпляра класса внутри класса

#c# #class

#c# #класс

Вопрос:

У меня есть класс foo как таковой:

     class Foo
    {

    }
  

и я инициализировал экземпляр как

     Foo _bar =new Foo();
  

Как мне получить имя переменной ( _bar для целей этого вопроса) в классе Foo?

Комментарии:

1. Какое имя вы хотели бы получить, если у вас есть более одной ссылки на ваш экземпляр (т.Е. Foo _bar2 = _bar; )?

2. …или List<Foo>.Add(new Foo());

3. @Josef Я думаю, я не задумывался об этом, потому что это не то, что произошло бы в данном конкретном случае, с которым я имею дело.

Ответ №1:

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

Если вы хотите, чтобы у ваших экземпляров были имена, вам придется добавить свойство к вашему классу, например, вот так:

 class Foo
{
    public string Name { get; set; }
}
  

и использовать его следующим образом:

 Foo bar = new Foo { Name = "baz" };
  

Комментарии:

1. Спасибо… вот как я это делаю сейчас, мне было интересно, есть ли более простой способ сделать это…

2. Фрагмент ничего не решает, ссылочное имя «bar» по-прежнему не может быть получено каким-либо образом. Это довольно фундаментально, одна из наиболее важных задач оптимизатора дрожания — избавиться от явных местоположений для переменных ссылки на объект и вместо этого сохранить их в регистре процессора. Делает код намного быстрее.

3. @Hans, что я хотел показать с помощью кода, так это то, что вы можете использовать свойство для хранения имени экземпляра. Конечно, вы правы в том, что нет способа получить имя bar из экземпляра в коде.

Ответ №2:

Вы можете включить «Foo _bar =new Foo();» внутри другого класса, а затем найти его с помощью отражения, а затем снова задать свойство elementname внутри класса Foo с помощью отражения.

 class Foo
{

public string ElementName {get; set;}


}

public class MyParent
{
Foo _bar =new Foo();

public MyParent()
{
//You can find Foo(s) here and then set ElementName of Each foo by reflection
}
}