2011-05-16 4 views
6

좋아, 그럼 ..... 지금까지ReadOnlyNameValueCollection

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

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

너무 좋아. 디버거에는 에 하나의 키 foo이 포함되어 있습니다.

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

좋아,이 정도로 간단해야한다 :

그러나 GetSection 반환 object는, 그래서 우리는 캐스트가 필요합니다. 그럼 ....

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

+2

다소 이상하게 들리지만 함수의 반환 유형은 실제로'object'이므로 내부 유형을 직접 노출하는 것과는 다릅니다 (컴파일하지 않더라도 믿을 수 없음). 그리고 public 타입에서 파생되기 때문에 객체를 사용할 수 있습니다. 내가 말할 수있는 것부터, GetSection의 요점은 당신이 당신이 그것을 벗어날 것으로 기대하고있는 것에 전화 할 때 당신이 알고 있다는 것이다. 그래서 그것이 유효하기 때문에 * 유효할만한 것이 있다면, 그것은 합리적인 것처럼 보입니다. 반환 유형이 실제로 기본 유형 일 때 내부 파생 유형을 반환하는 것으로 생각합니다. 문제 없어요, 그렇죠? – Tim

+0

'동적'키워드를 사용하여 회원 (예 : 키)에 액세스 할 수 있습니다. – user2341923