2014-02-07 74 views
1

所以,当我创建一个对象,我使用类似:如何用字符串名称创建一个对象?

Object objectName = new Object(); 

我也得到一个对象,它调用的方法,如

objectName.method(parameter); 

当我可以称之为对象名,但我怎么使它这样我就可以创建一个对象,可以参考我从字符串使用一个名称,是这样的:

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

,然后参考它像:

myName.method(parameter); 

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

+2

为什么你需要这样做?你想达到什么目的? – yoozer8

+0

[同样的问题](http://stackoverflow.com/questions/11888144/name-variable-using-string-net) – Jonesopolis

+0

@ 48klocs不同的问题。这是询问有关由字符串指定的类,而这一个是基于字符串命名变量 – yoozer8

回答

1

这几乎总是一个坏主意,但如果你一定要,看看Activator.CreateInstance()

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

由于这两种方法都需要您了解有关程序集的一些信息,因此我会补充说您可以创建一些示例代码,使用Type.AssemblyQualifiedName属性来告诉您需要什么名称。例如:

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

注意我用了dynamic宣布最终的结果,因为你不会知道你正在使用什么编译时间。这太麻烦了,再说一遍:请不要走这条路。

6

你试图做的事情几乎可以肯定地指出你的设计有问题。

在C#中不可能做这样的事情。你会得到最接近使用字典:

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

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

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

可以在C#中执行此操作(请参阅我的答案)。如果我确实去了字典路线,我不会这样做,因为它始终返回相同的对象实例。相反,我会存储一个名为类型的构造函数的委托('Func ')。 –

+0

@JoelCoehoorn老实说,我不知道我们的答案如何相关(也许我还没有正确地唤醒)。看来我们的答案回答了两个不同的问题。显然我的看法不正确。 –

+0

我也误解了这个问题。他在最后通过变量名选择表示他想要访问特定的对象实例,而不是创建新的对象,所以这很好。我试图删除我的downvote,但我不能,直到你编辑。 –

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更改为PersonSomeone而没有任何实质性更改)。

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

相关问题