2010-09-05 21 views
5

Kann der Körper der Methode während der Laufzeit geändert werden?C# Reflektion, Ändern des Körpers einer Methode

Ich wollte ein einfaches Eingabefeld (wie eine Textbox) haben, wo ich während der Laufzeit den Quelltext des Methodenkörpers schreiben kann.

Die Textbox kann Daten wie enthalten:

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

die excecuted werden sollte, wenn

new Person().DoSth() 

genannt wird.

Ist (oder wie ist das möglich) in C# möglich (mit Reflection)?
Vielen Dank für Ihre Hilfe im Voraus.

EDIT:
Wenn das oben genannte nicht möglich ist, ist es möglich, eine neue Methode während der Laufzeit zu erstellen und aufzurufen?

+1

Dies ist keine Reflexion, es ist Code-Generierung. Es ist auch keine großartige Idee. –

Antwort

5

Reflection.Emit ist ein Weg, IL zu erzeugen, zur Laufzeit ... http://msdn.microsoft.com/en-us/library/8ffc3x75(v=VS.90).aspx

Leichte Codegenerierung ein anderes ... http://blogs.msdn.com/b/joelpob/archive/2004/03/31/105282.aspx

Allerdings nehmen weder C# und kompilieren es. Dazu müssen Sie höchstwahrscheinlich den C# -Compiler aufrufen.

Was ist Ihr Anwendungsfall (warum möchten Sie das tun)? Bei der Ausführung von Code in Ihrer App-Domain gibt es Sicherheitsüberlegungen. Daher müssen Sie herausfinden, wie Sie damit umgehen.

+0

Ich wollte ein wenig Entwicklungsumgebung für einen Scanner-Generator machen. Der Generator erzeugt eine C# -Methode, die immer dann ausgeführt werden soll, wenn ein Token gefunden wird. Die Übergangstabellen können während der Laufzeit tatsächlich geladen werden (sie sind in der Datei gespeichert). Ich will einfach nicht das Lochscannerprogramm während der Entwicklung der Scannerspezifikation neu kompilieren. – raisyn

2

Sie können einen Methodenkörper zur Laufzeit nicht ändern. Es gibt nichts, was Ihnen erlaubt, dies zu tun. Das Beste, was Sie tun können, ist eine neue Methode auszugeben.

+0

Zumindest ohne 'dynamic' ... –

+1

@Steven, wie erlaubt' dynamic' das Ändern eines vorhandenen Typs? –

+0

Sie können ein 'ExpandoObject' verwenden, auf das mit' dynamic' verwiesen wird, so dass Sie einen Delegaten zuweisen können, so dass er mit Methodensyntax aufgerufen werden kann. –

Verwandte Themen