Pregunta

Por ejemplo en un .NET app.config podría obtener

<configuration>
   <configSections>
      <section name="MyConfig" type="MyAssembly.MyType, MyAssembly, PublicKeyToken=null" />
   </configSections>
   ...
</configuration>

La firma en la parte tipo parece ser estandarizados en una variedad de lugares de .NET pero no tengo ni idea de cómo hacer esto dentro de mis propios programas. Tengo System.Activator utilizado en mis programas, pero que siente como si estuviera duplicar el trabajo que .NET ya lo hace.

En términos de programación hago cómo hacer esto:

void Main()
{
   object instance = CreateInstance("MyAssembly.MyType, MyAssembly, PublicKeyToken=null");
   Console.WriteLine(instance.GetType().Name);
}

object CreateInstance(string dotNetTypeSignature)
{
   // Code goes here.
}
¿Fue útil?

Solución

Se puede llamar a la Type.GetType método para obtener un objeto Type con el nombre dado (montaje calificada).

Se puede llamar a la Activator.CreateInstance método a crear una instancia de un tipo. (Suponiendo que el tipo tiene un constructor público predeterminado, o que ya sabe lo que se necesita constructor de argumentos).

Por ejemplo:

Activator.CreateInstance(Type.GetType(name));

Otros consejos

Las secciones se suelen crear / visitada con el diseñador de la configuración de Visual Studio.

En el aspecto Explorador de soluciones bajo Propiedades-> Settings.settings o mediante click derecho en el proyecto nombre-> Propiedades-> Configuración.

El nombre de tipo completo se utiliza generalmente para hacer "tiempo de ejecución" a un tipo particular. En el ejemplo de archivo de configuración que tiene, el tipo de sección de configuración actual no se conoce en el momento de CLR de construcción, por lo que el ConfigurationManager tiene que leer el formulario tipo real del archivo de configuración y isntantiate en tiempo de ejecución. Esto se hace utilizando la clase System.Activator, como usted ha mencionado, y es la forma estándar de hacerlo en todo el mundo .Net.

Por supuesto, si el tipo que desea crear una instancia de que se conoce en tiempo de compilación, sólo debe hacer referencia al ensamblado que lo contiene y el uso new. Sin embargo, si se desea implementar la extensibilidad en tiempo de ejecución como el ConfigurationManager, se debe utilizar el Activator CreateInstance o CreateInstanceFrom métodos, que tienen las anulaciones que le permiten pasar la cadena exacta leer desde cualquier configuración que utiliza, o una instancia de Type, que también puede ser creado a partir de la misma cadena.

Y, por supuesto, está el otro lado, donde cualquier implementación de su punto de extensibilidad tiene que escribir el nombre de tipo completo. Para ello, puede utilizar typeof(MyType).FullName o myInstance.GetType().FullName.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top