Cómo encontrar una aplicación de C# de la interfaz en la actual asamblea con un nombre específico?

StackOverflow https://stackoverflow.com/questions/19656

Pregunta

Tengo una Interfaz llamada IStep que pueden hacer algunos cálculos (Ver "La ejecución en el Reino de los Sustantivos").En tiempo de ejecución, quiero seleccione la aplicación apropiada por el nombre de la clase.

// use like this:
IStep step = GetStep(sName);
¿Fue útil?

Solución

Tu pregunta es muy confuso...

Si usted quiere encontrar tipos que implementan IStep, a continuación, hacer esto:

foreach (Type t in Assembly.GetCallingAssembly().GetTypes())
{
  if (!typeof(IStep).IsAssignableFrom(t)) continue;
  Console.WriteLine(t.FullName + " implements " + typeof(IStep).FullName);
}

Si usted sabe ya el nombre de la clase, solo hacer esto

IStep step = (IStep)Activator.CreateInstance(Type.GetType("MyNamespace.MyType"));

Otros consejos

Si la aplicación tiene un constructor sin parámetros, usted puede hacer esto usando el Sistema.Activador de la clase.Usted tendrá que especificar el nombre de ensamblado además del nombre de la clase:

IStep step = System.Activator.CreateInstance(sAssemblyName, sClassName).Unwrap() as IStep;

http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx

Basado en lo que otros han señalado, esto es lo que terminé de escribir:

/// 
/// Some magic happens here: Find the correct action to take, by reflecting on types 
/// subclassed from IStep with that name.
/// 
private IStep GetStep(string sName)
{
    Assembly assembly = Assembly.GetAssembly(typeof (IStep));

    try
    {
        return (IStep) (from t in assembly.GetTypes()
                        where t.Name == sName && t.GetInterface("IStep") != null
                        select t
                        ).First().GetConstructor(new Type[] {}
                        ).Invoke(new object[] {});
    }
    catch (InvalidOperationException e)
    {
        throw new ArgumentException("Action not supported: " + sName, e);
    }
}

Bien Ensamblado.CreateInstance parecería ser el camino a seguir - el único problema con esto es que se necesita el nombre completo de la clase, es decir,incluyendo el espacio de nombres.

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