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
Es gibt für solche Zwecke in .NET anonyme Methoden bzw. Delegates.
Weeks of programming can save you hours of planning
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
Dieser Artikel sollte ein guter Einstieg sein: [Artikel] Delegaten, anonyme Methoden, Lambda-Ausdrücke & Co.
Weeks of programming can save you hours of planning
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
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 |
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
private int Main()
{
string programmingSkills = getMySkills("programming")
return = 1;
}
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.
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
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
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
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..
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.
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
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?
Nichts, weil das viel zu übertrieben wäre.
Du kannst auch einfach einen der vielen ScriptParser nehmen.