Inni już dał dobre odpowiedzi, w jaki sposób generowania kodu w czasie wykonywania tak myślałem, że chciałbym zaadresować akapit drugi. Mam pewne doświadczenie z tym i chcę po prostu podzielić się lekcją, której nauczyłem się z tego doświadczenia.
przynajmniej mogłem zdefiniować interfejs, że będą wymagane do zrealizowania, wtedy oni zapewnić a „sekcja” kod, który realizowany że interfejs.
Możesz mieć problem, jeśli używasz interface
jako typu podstawowego. Jeśli dodać jedną nową metodę do interface
w przyszłości wszystkie istniejące klasy klienckie dostarczone które implementują interface
teraz stają się abstrakcyjne, co oznacza, że nie będzie w stanie skompilować lub instancję klasy klienta dostarczane w czasie wykonywania.
Miałem ten problem, gdy nadszedł czas, aby dodać nową metodę po około 1 roku od wysyłki starego interfejsu i po dystrybucji dużej ilości "starszych" danych, które musiały być obsługiwane. W końcu stworzyłem nowy interfejs, który odziedziczył po starym, ale to podejście utrudniło ładowanie i tworzenie instancji klas dostarczonych przez klienta, ponieważ musiałem sprawdzić, który interfejs był dostępny.
Jednym z rozwiązań, o których myślałem wtedy, było użycie rzeczywistej klasy jako typu podstawowego, takiego jak ten poniżej. Samą klasę można oznaczyć jako abstrakcyjną, ale wszystkie metody powinny być pustymi wirtualnymi metodami (a nie metodami abstrakcyjnymi). Klienci mogą wtedy zastąpić żądane metody i mogę dodać nowe metody do klasy bazowej bez unieważniania istniejącego kodu dostarczonego przez klienta.
public abstract class BaseClass
{
public virtual void Foo1() { }
public virtual bool Foo2() { return false; }
...
}
Bez względu na to, czy ten problem dotyczy, należy rozważyć, jak przeprowadzić wersję interfejsu między bazą kodu a kodem dostarczonym przez klienta.
Znam ten post jest kilka lat, ale uważam, że warto wspomnieć o wprowadzeniu [Project] (http://msdn.microsoft.com/ Roslyn en-us/vstudio/roslyn.aspx), możliwość kompilowania surowego C# w locie i uruchamiania go w programie .NET jest trochę łatwiejsza. – Lawrence