c# - puede - que es una interfaz en programacion
¿Cómo encontrar una implementación de una interfaz C#en el ensamblado actual con un nombre específico? (4)
Tengo una interfaz llamada IStep
que puede hacer algunos cálculos (ver " Ejecución en el Reino de los sustantivos "). En tiempo de ejecución, quiero seleccionar la implementación adecuada por nombre de clase.
// use like this: IStep step = GetStep(sName);
Si la implementación tiene un constructor sin parámetros, puede hacerlo usando la clase System.Activator. Deberá especificar el nombre del 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
Tu pregunta es muy confusa ...
Si desea buscar tipos que implementen IStep, haga esto:
foreach (Type t in Assembly.GetCallingAssembly().GetTypes())
{
if (!typeof(IStep).IsAssignableFrom(t)) continue;
Console.WriteLine(t.FullName + " implements " + typeof(IStep).FullName);
}
Si ya conoce el nombre del tipo requerido, solo haga esto
IStep step = (IStep)Activator.CreateInstance(Type.GetType("MyNamespace.MyType"));
Well Assembly.CreateInstance parece ser el camino a seguir; el único problema con esto es que necesita el nombre completamente calificado del tipo, es decir, que incluya el espacio de nombres.
En base a lo que otros han señalado, esto es lo que terminé escribiendo:
/// /// 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); } }