D'autres ont déjà donné de bonnes réponses sur la façon de générer du code au moment de l'exécution, alors j'ai pensé répondre à votre deuxième paragraphe. J'ai une certaine expérience en la matière et je souhaite simplement partager une leçon que j'ai tirée de cette expérience.
Au minimum, je pourrais définir une interface qu'ils seraient tenus d'implémenter, puis ils fourniraient une "section" de code qui implémente cette interface.
Vous pouvez avoir un problème si vous utilisez un interface
comme type de base. Si vous ajoutez une seule nouvelle méthode au interface
à l'avenir, toutes les classes existantes fournies par le client qui implémentent la méthode interface
deviennent maintenant abstraites, ce qui signifie que vous ne pourrez pas compiler ou instancier la classe fournie par le client au moment de l'exécution.
J'ai rencontré ce problème lorsqu'il s'est agi d'ajouter une nouvelle méthode après environ un an d'utilisation de l'ancienne interface et après avoir distribué une grande quantité de données "héritées" qui devaient être prises en charge. J'ai fini par créer une nouvelle interface qui héritait de l'ancienne, mais cette approche a rendu plus difficile le chargement et l'instanciation des classes fournies par le client, car je devais vérifier quelle interface était disponible.
Une solution à laquelle j'ai pensé à l'époque consistait à utiliser une classe réelle comme type de base, comme dans l'exemple ci-dessous. La classe elle-même peut être marquée abstraite mais toutes les méthodes doivent être des méthodes virtuelles vides (pas des méthodes abstraites). Les clients peuvent alors surcharger les méthodes qu'ils souhaitent et je peux ajouter de nouvelles méthodes à la classe de base sans invalider le code existant fourni par le client.
public abstract class BaseClass
{
public virtual void Foo1() { }
public virtual bool Foo2() { return false; }
...
}
Indépendamment du fait que ce problème s'applique ou non, vous devez réfléchir à la manière de versionner l'interface entre votre base de code et le code fourni par le client.
12 votes
Je sais que ce post date de quelques années, mais j'ai pensé qu'il valait la peine d'être mentionné avec l'introduction de la Projet Roslyn En effet, la possibilité de compiler du C# brut à la volée et de l'exécuter dans un programme .NET est un peu plus facile.