C# 如何使用字符串的值作为对象的名称?

C# 如何使用字符串的值作为对象的名称?,c#,oop,object,C#,Oop,Object,嗨。 有没有办法,我可以引用任何字符串值的对象 Classname person1 = new Classname("John"); Classname person2 = new Classname("Martin"); string getValue = "person1"; 我尝试过:Console.WriteLinegetValue.name;很明显,它没有起作用 我能做什么来代替这个呢?您可以在字符串键下将Classname

嗨。 有没有办法,我可以引用任何字符串值的对象

Classname person1 = new Classname("John");
Classname person2 = new Classname("Martin");
string getValue = "person1";
我尝试过:Console.WriteLinegetValue.name;很明显,它没有起作用
我能做什么来代替这个呢?

您可以在字符串键下将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);
    }
}
如果您有1000个名称,并且希望检索实例/通过O1中的名称检查特殊类名实例的重复项,那么这可能是有意义的-然后将它们放入一个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
}

仍然觉得这是一个构造好的示例。

您可以将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);
    }
}
如果您有1000个名称,并且希望检索实例/通过O1中的名称检查特殊类名实例的重复项,那么这可能是有意义的-然后将它们放入一个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
}
仍然觉得这是一个很好的例子。

你不能。 如果要引用多个枚举对象,只需使用对象创建一个数组或列表。 比如说

Classname[] classnames = {new Classname("..."), new Classname("...")};
然后您可以将它们引用为类名[0]和类名[1]

您不能这样做。 如果要引用多个枚举对象,只需使用对象创建一个数组或列表。 比如说

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

然后,您可以将它们引用为类名[0]和类名[1]

如果您解释一下您试图用这种方法解决的问题是什么,可能会更好。您能解释一下为什么要这样做吗?我以前从未见过这样的事情,坦率地说,这似乎是一个坏主意,不管它是为了什么,除了可能的代码分析-但再次强调,即使在那时,你也不会硬编码字符串中的变量名。如果你解释一下你试图用这种方法解决的问题,也许会更好。你能解释一下为什么你想要这样吗?我以前从未见过这样的事情,坦率地说,这似乎是个坏主意,不管它是做什么的,除了可能的代码分析——但同样,即使在那时,你也不会硬编码字符串中的变量名。