2011-05-16 57 views
6

好了,所以.....ReadOnlyNameValueCollection(從ConfigurationManager.GetSection閱讀)

<section name="test" type="System.Configuration.NameValueFileSectionHandler" /> 
<test> 
    <add key="foo" value="bar" /> 
</test> 

var test = ConfigurationManager.GetSection("test"); 

到目前爲止好。調試器顯示test包含一個密鑰foo

GetSection回報object,所以我們需要一個轉換:

var type = test.GetType(); 
// FullName: System.Configuration.ReadOnlyNameValueCollection 
// Assembly: System 

好吧,這應該是很簡單的。所以......

using System; 

var test = ConfigurationManager 
       .GetSection("test") as ReadOnlyNameValueCollection; 

錯誤!

The type or namespace ReadOnlyNameValueCollection does not exist in the namespace System.Configuration. Are you missing an assembly reference?

嗯...跆拳道?

轉換到System.Collections.Specialized.NameValueCollection得到的代碼工作,但我真的不明白爲什麼錯誤。

而在MSDN上搜索ReadOnlyNameValueCollection顯示根本沒有這個類的文檔。它似乎並不存在。然而我在我的代碼中有這種類型的實例。

回答

13

System.Configuration.ReadOnlyNameValueCollection是System.dll程序集的一個internal類。所以你不能從你的代碼中引用它。它來自於System.Collections.Specialized.NameValueCollection,所以這就是爲什麼你能夠在演員陣容中做到這一點。

+1

好吧,這是有道理的。但是他們爲什麼要從公開的方法中返回一個內部類?然後不提供任何文件?這不被認爲是不好的做法?你想在什麼情況下這樣做? – fearofawhackplanet 2011-05-16 15:08:01

+2

看起來有些奇怪,但函數的返回類型實際上是'object',所以它不像他們直接暴露內部類型(甚至不會編譯,我不相信)。而且,由於它來自公共類型,因此可以使用該對象。從我所知道的來看,GetSection的意義在於,你知道什麼時候你打電話給它,你期望從中獲得什麼。所以只要有*東西*爲它投下來是有效的,這似乎是合理的。 我比較它返回一個內部的派生類型,當返回類型真的是基類型。那裏沒有問題,對吧? – Tim 2011-05-16 15:10:28

+0

您可以使用'dynamic'關鍵字訪問成員(例如Keys)。 – user2341923 2014-11-08 11:07:46