2010-09-05 18 views
5

Czy można zmienić treść metody w czasie wykonywania?C# Odbicie, zmiana ciała metody

class Person 
{ 
    public void DoSth() 
    { Console.WriteLine("Hello!"); } 
} 

Chciałem mieć proste pole wejściowe (np. Pole tekstowe), w którym mogę zapisać kod źródłowy treści metody w czasie wykonywania.

Pole tekstowe mogą zawierać dane, takie jak:

for (int i = 0; i < 5; i++) 
    Console.WriteLine(i); 

które należy ścięci gdy

new Person().DoSth() 

jest tzw.

Czy (lub jak jest) jest to możliwe w języku C# (przy użyciu refleksji)?
Dzięki za pomoc z góry.

EDYTOWANIE: Jeśli powyższe nie jest możliwe, czy możliwe jest utworzenie nowej metody podczas uruchamiania i wywołanie jej?

+1

To nie jest odbicie, to generowanie kodu. To także nie jest świetny pomysł. –

Odpowiedz

5

Reflection.Emit jest jednym ze sposobów generowania IL przy starcie ... http://msdn.microsoft.com/en-us/library/8ffc3x75(v=VS.90).aspx

Lekki generowania kodu jest inny ... http://blogs.msdn.com/b/joelpob/archive/2004/03/31/105282.aspx

Jednak ani nie weź C# i skompiluj go. W tym celu najprawdopodobniej będziesz musiał wywołać kompilator C#.

Jaki jest twój przypadek użycia (dlaczego chcesz to zrobić)? Istnieją kwestie związane z bezpieczeństwem z uruchomionym kodem w domenie aplikacji, więc musisz się zastanowić, jak sobie z tym poradzić.

+0

Chciałem stworzyć trochę rozwijającego się środowiska dla generatora skanerów. Genertor tworzy metodę C#, którą należy wykorzenić za każdym razem, gdy zostanie znaleziony token. Tabele przejściowe mogą być faktycznie ładowane podczas wykonywania (są przechowywane w pliku). Po prostu nie chcę przekompilowywać programu skanera dziurowego przy opracowywaniu specyfikacji skanera. – raisyn

2

Nie można zmienić treści metody w czasie wykonywania. Nic nie pozwala ci to zrobić. Najlepsze, co możesz zrobić, to wydać nową metodę.

+0

Przynajmniej bez 'dynamic' ... –

+1

@Steven, jak' dynamic' pozwala modyfikować istniejący typ? –

+0

Można użyć 'ExpandoObject', do którego odwołuje się' dynamic', co pozwala przypisać delegata, aby można go było wywołać przy użyciu składni metody. –