2009-12-30 33 views
3

是否有可能在C#中按名稱獲取對象?C#:如何通過存儲在String中的名稱獲取對象?

即得到this.obj0使用

string objectName = "obj0"; 
executeSomeFunctionOnObject(this.someLoadObjectByName(objectName)); 
+1

你能舉一個這個名字如何映射到對象的例子嗎?你在尋找一個對象實例還是一個類型?你想要現有的實例還是創建新的實例? –

回答

8

不,不是這樣的。

對象沒有名稱 - 變量。一個對象可以被任意數量的變量引用:零,一個或多個。

什麼你可以做,但是,是字段(靜態或實例變量)的名稱(用Type.GetField)獲得和(,對於一個特定的實例,如果你正在使用的實例變量)獲得這些字段的值。

根據你想要做什麼,你可能也想考慮從名字到對象的字典。

+0

很少有人明確表示不能這樣做,所以你可以繼續前進,看看不同的方法。謝謝。 –

1

不,不是所有對象都有名稱屬性(對於初學者)。

但是,您可以將感興趣的對象存儲在Dictionary<string, object>中。您也可以通過名稱獲得控件,確切的方法取決於UI庫。

0

無法按名稱訪問對象。儘管如此,使用反射可以實現類的所有字段和屬性(如果需要,可以按名稱)。如果你的對象存儲在現場級變量或屬性,那麼這會給你想要的東西:

Type myType = typeof(MyClass); 
FieldInfo[] myFields = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); 

PropertyInfo[] myproperties = myType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); 

您也可以撥打getfield命令和getProperty(單數),並通過在一個字符串使其返回與該名稱匹配的單個成員(確保檢查爲空)。

閱讀這些網頁在這種情況下,對使用的反射方法的詳細信息:

GetProperty

GetProperties

GetField

GetField

0

嗯,我想你在找什麼因爲是Reflection.

這裏你可以看到一個很好的例子: http://www.switchonthecode.com/tutorials/csharp-tutorial-using-reflection-to-get-object-information

正如前面所說的 - 對象沒有名字,但你可以穿越的對象,並得到他們的類型,採取相應的行動。

此博客here展示了遍歷和反射使用的一個很好的示例。

這應該是一個很好的開始。 享受!

+0

你不能遍歷'所有對象'。 –

+0

@Hank,爲什麼不呢?看我的版本。 –

+0

yN2,OQ想要搜索所有'已加載'的對象(我認爲)。這更接近垃圾收集而不是Reflection。 –

相關問題