【问题标题】:How to create an object with name from string? [duplicate]如何从字符串创建具有名称的对象? [复制]
【发布时间】:2014-02-07 14:22:05
【问题描述】:

所以当我创建一个对象时,我会使用类似的东西:

Object objectName = new Object();

我得到一个对象,当调用像

这样的方法时,我可以将其称为 objectName
objectName.method(parameter);

但是我要怎么做才能创建一个对象,我可以使用字符串中的名称来引用它,例如:

string objectName = "myName";
Object [objectName] = new Object();

然后像这样引用它:

myName.method(parameter);

所以以某种方式将字符串 objectName 插入到新对象的实际名称中。 我该怎么做?

编辑:5 年后(以及 CS 学位)我在自己的个人资料中偶然发现了这个问题,然后笑了。用例是创建对象来存储有关视频游戏世界中位置的数据,当时我没有意识到您可以拥有没有名称的对象。我实际上需要的解决方案就是一个对象数组。

【问题讨论】:

  • 为什么需要这样做?你想完成什么?
  • @48klocs 不同的问题。这询问了由字符串指定的类,而这个是关于基于字符串命名变量
  • 我不确定您为什么要这样做。请说明您希望这样做的原因,您很可能会为您的问题找到更好的解决方案。
  • 我没有意识到你正在超越反射并进入动态代码生成或其他东西。这不仅在 C# 中行不通(也许你可以在 T4 中拼凑一些东西),我想不出任何语言(在运行时更改变量名或其他东西)甚至接近一个似乎的想法。

标签: c# string object insert


【解决方案1】:

您尝试做的几乎肯定表明您的设计存在问题。

在 C# 中不可能做这样的事情。最接近的方法是使用字典:

var objectDictionary = new Dictionary<string, object>();

objectDictionary.Add("myName", new YourClass());

// .. then
var objInstance = objectDictionary["myName"] as YourClass;

【讨论】:

  • 可以在 C# 中执行此操作(请参阅我的答案)。如果我确实走字典路线,我不会这样做,因为它总是返回相同的对象实例。相反,我会存储一个调用该类型的构造函数的委托 (Func&lt;T&gt;)。
  • @JoelCoehoorn 老实说,我不确定我们的答案是如何关联的(也许我还没有正常醒来)。看来我们的答案是在回答两个不同的问题。显然我的不正确。
  • 我也误读了这个问题。他确实通过最后的变量名称选择表明他想要访问特定的对象实例,而不是创建新对象,所以这很好。我试图删除我的反对票,但在您编辑之前我无法删除。
  • @JoelCoehoorn 欣赏它。我重新阅读了这个问题,我的答案和你的答案大约 20 次,我感到很困惑。我刚刚编辑了它。
【解决方案2】:

没有进一步的详细说明,您似乎正在尝试使用对象名称创建然后引用对象。如果是这种情况,您可以为对象添加一个属性,然后使用它来查找对象:

public class myClass
{
    public string name;
    ...
    public myClass(string ObjectName)
    {
        name = ObjectName; //Construct the object with this name you've input
    }
    ...
}

然后,您可以将对象存储在某种集合中:

...
List<myClass> myObjects = new List<myClass>();
myObjects.Add(new myClass("Bob")); //Creating an object we've named "Bob" 
myObjects.Add(new myClass("Alice"));
...

最后,当您以后需要找到它时:

...
string nameToFind = "Bob";
myClass Bob = myObjects.Find(obj => obj.name == nameToFind); //Find "Bob"
...

现在您可以随意使用Bob 对象,请注意,这不是您所说的问题的解决方案。无法按照您要求的方式通过字符串在代码中创建对象的名称(至少据我所知),但您现在可以引用名为“Bob”的对象,源代码调用的对象它应该是无关紧要的(即,您可以将Bob 更改为PersonSomeone 而无需任何实际更改)。

我没有时间确保代码按原样运行,但希望如果我对您的意图的猜测是正确的,这将帮助您弄清楚您需要做什么。

【讨论】:

    【解决方案3】:

    这几乎总是一个坏主意,但如果必须,请查看Activator.CreateInstance()

    此方法有两个(对您)有用的重载。第一个接受两个字符串,并要求您具有完全限定的类型名称和定义所需类型的程序集名称。第二个需要Type 参数,但您可以使用Type.GetType() 方法从具有该类型的程序集限定名称的字符串中获取类型。

    由于这两种方法都要求您对程序集有所了解,我将补充一点,您可以创建一些示例代码,使用Type.AssemblyQualifiedName 属性来告诉您需要什么名称。例如:

    string test = "";
    string TypeName = test.GetType().AssemblyQualifiedName;
    dynamic newString = Activator.CreateInstance(Type.GetType(TypeName));
    

    请注意,我使用dynamic 来声明最终结果,因为您在编译时不会知道您正在处理什么。这很混乱,所以再说一遍:请不要走这条路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多