2011-05-16 8 views
6

Ok, así que .....ReadOnlyNameValueCollection (lectura de ConfigurationManager.GetSection)

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

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

Hasta aquí todo bien. El depurador muestra test contiene una clave, foo.

Pero GetSection vuelve object, por lo que necesitan un reparto:

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

Ok, esto debe ser lo suficientemente simple. Entonces ...

using System; 

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

error!

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

err ... wtf?

Un molde a System.Collections.Specialized.NameValueCollection hace que el código funcione, pero realmente no entiendo por qué el error.

Y una búsqueda de ReadOnlyNameValueCollection en MSDN muestra que no hay documentación en esta clase. No parece existir. Sin embargo, tengo una instancia de ese tipo en mi código.

Respuesta

13

System.Configuration.ReadOnlyNameValueCollection es una clase internal para el ensamblado System.dll. Entonces no puedes consultarlo desde tu código. Se deriva de System.Collections.Specialized.NameValueCollection, así que es por eso que puedes hacer eso con el elenco.

+1

Bien, eso tiene sentido. Pero entonces, ¿por qué están devolviendo una clase interna de un método público? Y luego no proporciona ninguna documentación? ¿Esto no se considera una mala práctica? ¿Bajo qué circunstancia quieres hacer esto? – fearofawhackplanet

+2

Parece un poco extraño, pero el tipo de retorno de la función es en realidad 'objeto', por lo que no es como si estuvieran exponiendo directamente el tipo interno (que ni siquiera compilaría, no lo creo). Y dado que deriva de un tipo público, puede hacer uso del objeto. Por lo que puedo decir, el objetivo de 'GetSection' es que usted sepa cuándo llamará a lo que espera obtener de él. Así que mientras haya * algo * para que sea valido, parece razonable. Lo comparo para devolver un tipo derivado interno cuando el tipo de devolución es realmente el tipo base. No hay problemas allí, ¿verdad? – Tim

+0

Puede acceder a los miembros (por ejemplo, Llaves) utilizando la palabra clave 'dynamic'. – user2341923