Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从字符串创建名称为的对象?_C#_String_Object_Insert - Fatal编程技术网

C# 如何从字符串创建名称为的对象?

C# 如何从字符串创建名称为的对象?,c#,string,object,insert,C#,String,Object,Insert,因此,当我创建一个对象时,我会使用如下内容: Object objectName = new Object(); string objectName = "myName"; Object [objectName] = new Object(); 我得到了一个对象,在调用类似 objectName.method(parameter); 但是我如何创建一个对象,我可以使用字符串中的名称来引用它,比如: Object objectName = new Object(); string obje

因此,当我创建一个对象时,我会使用如下内容:

Object objectName = new Object();
string objectName = "myName";
Object [objectName] = new Object();
我得到了一个对象,在调用类似

objectName.method(parameter);
但是我如何创建一个对象,我可以使用字符串中的名称来引用它,比如:

Object objectName = new Object();
string objectName = "myName";
Object [objectName] = new Object();
然后像这样引用它:

myName.method(parameter);
因此,以某种方式将字符串objectName插入到新对象的实际名称中。 我该怎么做


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

您试图做的几乎肯定指向您的设计中的一个问题

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

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

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

// .. then
var objInstance = objectDictionary["myName"] as YourClass;
var objectDictionary=newdictionary();
Add(“myName”,newyourclass());
// .. 然后
var objInstance=objectDictionary[“myName”]作为您的类;

这几乎总是一个坏主意,但如果必须这样做,请仔细研究

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

由于这两种方法都要求您对程序集有所了解,因此我要补充的是,您可以创建一些示例代码,使用该属性来告诉您所需的名称。例如:

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

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

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

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"));
...
现在,您可以随意使用
Bob
对象,请注意,这并不是解决问题的方法。没有办法按照您要求的方式(至少据我所知)通过字符串在代码中生成对象的名称,但是您现在可以引用名为“Bob”的对象,源代码对其的调用应该是不相关的(即,您可以将
Bob
更改为
Person
Someone
,而无需任何实际更改)


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

为什么需要这样做?你想做什么?@48klocs不同的问题。这会询问由字符串指定的类,而这是关于基于字符串命名变量的问题。我不确定您为什么要这样做。请解释你为什么希望这样做,你很可能会得到一个更好的解决你的问题的办法。我不知道你正在超越反射,进入动态代码生成或其他什么。这不仅在C#中不起作用(也许你可以在T4中拼凑出一些东西),我想不出哪种语言(在运行时更改变量名或其他东西)会有这样的想法。在C#中也可以这样做(见我的答案)。如果我真的使用字典,我不会这样做,因为它总是返回相同的对象实例。相反,我会存储一个调用类型构造函数的委托(
Func
)。@JoelCoehoorn老实说,我不确定我们的答案之间有什么关系(也许我还没有完全清醒过来)。我们的答案似乎回答了两个不同的问题。很明显,我的错了。我也误读了这个问题。他确实通过最后的变量名选择表明他希望访问特定的对象实例,而不是创建新的对象,所以这很好。我试图删除我的反对票,但在你编辑之前我无法删除。@JoelCoehoorn感谢你。我把这个问题、我的答案和你的答案重读了大约20遍,我感到非常困惑。我刚刚编辑了它。