Laden...

Von Benutzer eingegebenen Script-Code ausführen (Ersatz für Foxpro &-Operator?)

Erstellt von reloop vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.474 Views
reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren
Von Benutzer eingegebenen Script-Code ausführen (Ersatz für Foxpro &-Operator?)

Hallo liebe Community,

ich habe eine Frage bezüglich dem Ausführen von Code, der nicht fest im Programm hinterlegt ist.

Ich hoffe es wird nicht zu unverständlich, aber ich versuch es mal:

Eine "alte" Visual Foxpro-Lösung wird umgeschrieben. Dort hatte der Anwender bisher die möglichkeit über Tabellen, welche Memo-Felder beinhalteten (Mediumtext im SQL) eigene Expressions zu hinterlegen.

Das sah wie folgt aus:

"iif(Expression,Fall1,Fall2)"

Und wurde im Code wiefolgt verwendet:

cCode = tabelle.Wert // entspricht "iif(Expression,Fall1,Fall2)"

if &cCode
 ... beliebiger Code
endif

Der Operator "&" hat also den Code in der Variable cCode ausgeführt.
Gibt es diese Möglichkeit auch in C-SHARP?

Ich hoffe, es ist nicht all zu verwirrend.

Gruß,
reloop

5.658 Beiträge seit 2006
vor 13 Jahren

Es gibt für solche Zwecke in .NET anonyme Methoden bzw. Delegates.

Weeks of programming can save you hours of planning

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Hallo MrSparkle,

mir ist gegenwärtig nicht bewusst, wie mir die Verwendung von delegates oder anonymen Methoden weiterhelfen sollte.

Vielleicht, kannst du mir ja auf die Sprünge helfen.

Gruss

5.658 Beiträge seit 2006
vor 13 Jahren

Dieser Artikel sollte ein guter Einstieg sein: [Artikel] Delegaten, anonyme Methoden, Lambda-Ausdrücke & Co.

Weeks of programming can save you hours of planning

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Danke für deine zügige Antwort.

Ich kann dir jedoch nicht folgen, in wie weit mir das Verwenden von delegates & anonymen Methoden an dieser Stelle weiterhelfen soll.

Mir ging es darum, ob es in C# ein äquivalent zum Macro-Operator in Visual Foxpro gibt. Bedeutet, Code zur "Laufzeit auszuführen". Oder zumindest Bedingungen extern zu Verwalten.

Vielen Dank für deine Hilfe & Mühe,
reloop

2.298 Beiträge seit 2010
vor 13 Jahren

Eventuell kannst du mit CodeDom arbeiten.
Such einfach mal dannach.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

S
341 Beiträge seit 2008
vor 13 Jahren

Servus,

reloop ich hoffe ich hab dich richtig verstanden...
Du möchtest code ausführen der nicht fest im programm hinterlegt ist und zur compilezeit des programm nicht vorhanden.

Ein äquivalent zu dem was du da hast hab ich noch keine gesehen, aber das problem kann man sicher auch anders lösen.

Andernfalls würd ich instinktiv davon ausgehen das du den code im "Textfeld" zur laufzeit compilieren musst um ihn ausführen zu können.

Grüße

PS: sei doch so freundlich und poste deine lösung hier sobald eine hast

**Nur die Kenner können mit 10 Fingern bis 1023 zählen !!**
private int Main()
{
   string programmingSkills = getMySkills("programming")
   return = 1;
}
5.742 Beiträge seit 2007
vor 13 Jahren

Der Operator "&" hat also den Code in der Variable cCode ausgeführt.
Gibt es diese Möglichkeit auch in C-SHARP?

Also so eine Art "eval" wie in Javascript?

Nein, das gibt es in C# nicht und das ist auch gut so - alleine das Vorhandensein solcher Konstrukte deutet meist auf suboptimales Design hin.
Und genau das Design sollte man überarbeiten wenn man etwas von FoxPro migriert - sonst kann man sich die Migration auch gleich sparen; wartbarer wird der Code im Normalfall nicht.

5.658 Beiträge seit 2006
vor 13 Jahren

Jedoch, zum wiederholten male, hilft mir ein Delegate an dieser Stelle nicht weiter.

Warum nicht? Wo liegt das Problem? Kannst du uns deine Vorgehensweise erklären und warum du mit den vorgeschlagenen Möglichkeiten nicht weiterkommst?

Weeks of programming can save you hours of planning

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Also:

Um mal konkret zu werden:

Es geht darum, dass ich ein Projekt übernommen habe, wo es die Möglichkeit gibt, dass der Kunde über ein Memofeld Textmarken zu Word-Dokumenten hinterlegen kann.

Bedingung ist es, dass diese in ihrer alten Form bestehen bleiben sollen.

Momentan gibt es also eine Tabelle mit einer endlichen Anzahl von Dokumenten die in einem Textfeld (Memofeld) ihre Textbausteine hinterlegt haben.

Das sieht so aus:

tvTextÜberschreiben("Euro1",iif(adrs.einwohner<5000,"1.200,00 EUR",""))

Das ist jetzt nur eine von vielen Zeilen, aus diesem Memofeld. Eine Methode zu implementieren, die ein Textdokument öffnet und eine Textmarke mit einem beliebigen Wert besetzt, ist kein Problem. Jedoch dem Kunden die Möglichkeit zu überlassen, individuelle Werte (in dem Fall mithilfe von einem IIF) zu hinterlegen.

Ich hoffe, mein Problem wird für einige nun etwas klarer und ich bitte meine anfängliche ungenaue Beschreibung zu entschuldigen.

Gruss

5.658 Beiträge seit 2006
vor 13 Jahren

Du schreibst von Memofeldern, Tabellen und Word-Dokumenten. Sind das alles Objekte aus Word, oder nur Umschreibungen für etwas anderes? Was z.B. ist die IIF/iif-Funktion, etwas Delphi- oder Wordspezifisches oder eine eigene Funktion?

Weeks of programming can save you hours of planning

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Pardon.

Memo-Felder sind, vereinfachter ausgedrückt, Textfelder in der Datenbank.
Definition Memo-Fields

IIF entspricht einer unteranderem in Visual Foxpro geläufigen Abfrage:
Hinweis IIF

In C# würde ich dort zum "? :"-Konstrukt greifen.

Und das Word-Dokument existiert als Datei auf der Festplatte.

Gruss..

L
416 Beiträge seit 2008
vor 13 Jahren

Wenn es unbedingt analog sein soll wirst du wohl nicht drum herumkommen selbst men kleinen Parser, etc zu schreiben. Dürfte ja nicht allzu viel Aufwand sein wenn es sich nur um das IIF Konstrukt handelt. Aber ja die optimale Lösung ist was nicht grad.

N
60 Beiträge seit 2010
vor 13 Jahren

Ich halte die Lösung für kleine eingebaute Skripte einen Parser zu schreiben für Optimal. Was wäre denn besser?

Grüße
Nils

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Ich habe mir folgenden Lösungsansatz überlegt:

Mithilfe von CSharpCodeProvider und CompilerResults werde ich mir zur Laufzeit eine Assembly generieren, welche die gewünschten Zeilen in einer Methode zur Verfügung stellt, auf die ich zugreife.

Compilieren würde ich die Assembly aus einem String, den ich mir zusammenbaue. Das Objekt ICodeCompiler sollte ausreichend sein.

Was haltet ihr davon?

F
10.010 Beiträge seit 2004
vor 13 Jahren

Nichts, weil das viel zu übertrieben wäre.

Du kannst auch einfach einen der vielen ScriptParser nehmen.

Codeproject-Suche nach script

L
416 Beiträge seit 2008
vor 13 Jahren