2014-02-07 72 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而沒有任何實質性更改)。

我沒有時間,以確保代碼按原樣運行,但我希望如果我的你的意圖的猜測是正確的,這將幫助你找出你需要做什麼。

相關問題