#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
}
}