所以当我创建一个对象时,我会使用类似的东西:
Object objectName = new Object();
我在调用像
这样的方法时得到一个可以称为objectName的对象objectName.method(parameter);
但是我如何制作它以便我可以使用字符串中的名称创建一个可以引用的对象,例如:
string objectName = "myName";
Object [objectName] = new Object();
然后将其称为:
myName.method(parameter);
因此以某种方式将字符串objectName插入到新对象的实际名称中。 我该怎么做?
答案 0 :(得分:6)
您尝试做的几乎肯定会指出您的设计存在问题。
在C#中不可能做这样的事情。你最接近的是使用字典:
var objectDictionary = new Dictionary<string, object>();
objectDictionary.Add("myName", new YourClass());
// .. then
var objInstance = objectDictionary["myName"] as YourClass;
答案 1 :(得分:1)
这几乎总是一个坏主意,但如果必须,请查看Activator.CreateInstance()
。
此方法有两个有用的(给你)重载。第一个接受两个字符串,并且要求您具有完全限定的类型名称和定义所需类型的程序集名称。第二个需要一个Type
参数,但您可以使用Type.GetType()
方法从字符串中获取具有该类型的程序集限定名称的类型。
由于这两种方法都需要您对程序集有所了解,因此我将添加您可以创建一些使用Type.AssemblyQualifiedName
属性的示例代码来告诉您需要的名称。例如:
string test = "";
string TypeName = test.GetType().AssemblyQualifiedName;
dynamic newString = Activator.CreateInstance(Type.GetType(TypeName));
请注意,我使用dynamic
来声明最终结果,因为您在编译时不会知道您正在使用什么。这是混乱的,所以再次:请不要走这条路。
答案 2 :(得分:0)
如果没有进一步详细说明,您似乎正在尝试使用对象的名称创建然后引用对象。如果是这种情况,您可以向对象添加属性,然后使用它来稍后查找对象:
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
更改为Person
或Someone
而不做任何实际更改。
我没有时间确保代码按原样运行,但希望如果我对你的意图的猜测是正确的,这将有助于你弄清楚你需要做什么。