Otros ya han dado buenas respuestas sobre cómo generar código en tiempo de ejecución, así que pensé que abordaría su segundo párrafo. Tengo algo de experiencia con esto y solo quiero compartir una lección que aprendí de esa experiencia.
Por lo menos, podría definir una interfaz que serían necesarios para implementar , a continuación, que proporcionarían una 'sección' código que implementa la interfaz que .
Puede tener un problema si utiliza un interface
como tipo de base. Si agrega un único método nuevo al interface
en el futuro, todas las clases existentes suministradas por el cliente que implementan el interface
ahora se vuelven abstractas, lo que significa que no podrá compilar ni crear instancias de la clase suministrada por el cliente en el tiempo de ejecución.
Tuve este problema cuando llegó el momento de agregar un nuevo método después de aproximadamente 1 año desde el envío de la interfaz anterior y después de distribuir una gran cantidad de datos "heredados" que debían ser compatibles. Terminé creando una nueva interfaz heredada de la anterior, pero este enfoque hizo más difícil cargar y crear instancias de las clases suministradas por el cliente porque tenía que verificar qué interfaz estaba disponible.
Una solución en la que pensé en ese momento era usar una clase real como tipo de base como la siguiente. La clase en sí misma se puede marcar como abstracta, pero todos los métodos deben ser métodos virtuales vacíos (no métodos abstractos). Los clientes pueden anular los métodos que desean y puedo agregar nuevos métodos a la clase base sin invalidar el código existente proporcionado por el cliente.
public abstract class BaseClass
{
public virtual void Foo1() { }
public virtual bool Foo2() { return false; }
...
}
Independientemente de si se aplica este problema se debe considerar la forma de versión de la interfaz entre su base de código y el código de cliente por el proveedor.
Sé que este post es un par de años, pero pensé que vale la pena mencionar la introducción de la [Proyecto Roslyn] (http://msdn.microsoft.com/ en-us/vstudio/roslyn.aspx), la capacidad de compilar C# sin procesar sobre la marcha y ejecutarlo dentro de un programa .NET es un poco más fácil. – Lawrence