Как я могу использовать значение строки в качестве имени объекта?

#c# #oop #object

#c# #ооп #объект

Вопрос:

Привет.
Могу ли я каким-либо образом ссылаться на объект со значением любой строки?

 Classname person1 = new Classname("John");
Classname person2 = new Classname("Martin");
string getValue = "person1";
  

Я пробовал это: Console.WriteLine(getValue.name); и, очевидно, это не сработало. 🙁
Что я мог бы сделать вместо этого?

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

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

2. Не могли бы вы объяснить, почему вы этого хотите? Я никогда не видел ничего подобного раньше, и, честно говоря, это кажется плохой идеей, для чего бы это ни было, за исключением, может быть, анализа кода — но опять же, вы бы не стали жестко кодировать имена переменных в строках даже тогда.

Ответ №1:

Вы можете сохранить свои экземпляры Classname класса в словаре под строковым ключом:

 using System;
using System.Collections.Generic;

public class Classname
{
    public string Name { get; set; } 
    public Classname(string name) { Name = name; }
}

public static class Program
{
    public static void Main()
    {
        // store class instance under a name to be referenced later
        var dict = new Dictionary<string, Classname>
        {
            ["person1"] = new Classname("John"),
            ["person2"] = new Classname("Martin"),
        };

        Console.WriteLine(dict["person1"].Name);
    }
}
  

Вывод:

 John
  

Это может иметь смысл, если у вас 1000 имен и вы хотите получить экземпляр / проверить дубликаты для специального экземпляра Classname по его Name in O(1) — затем вы помещаете их в dict под тем же именем, с которым они создаются:

 var dict = new Dictionary<string, Classname>();

// use your list of names instead here
foreach (var nameNumber in Enumerable.Range(1, 2000))
{
    var name = $"Name_{nameNumber}";
    dict.Add(name, new Classname(name));
}

// dict provides O(1) access and O(1) check if already created 
// an instance with that name


// check if inside, do not retrieve
if (dict.ContainsKey("Name_155"))
    Console.WriteLine("Name_155 already constructed");

// check and retrieve, create   add if not there
var n = "Name_4000"
if (dict.TryGetValue(n, out var inst))
{
    // do smth with inst
}
else
{
    dict.Add(n, new Classname(n));
    inst = dict[n]; 
    // do smth with inst
}
  

Все еще чувствую, что это довольно сложный пример.

Ответ №2:

Вы не можете. Если вы хотите ссылаться на несколько перечисленных объектов, просто создайте массив или список со своими объектами. например

 Classname[] classnames = {new Classname("..."), new Classname("...")};
  

затем вы можете ссылаться на них как classnames[0] и classnames[1]