Cómo encontrar una aplicación de C# de la interfaz en la actual asamblea con un nombre específico?
-
09-06-2019 - |
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);
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.