Jeg henter noget tekst der blandt andet indeholder nogle hjemmelavede tags fx ##ValueClass("Param1", "Param2").Value## hvor ValueClass er en C# klasse. Så jeg vil gerne kunne erstatte selve tagget med værdien af "eksekveringen" af det der står i tagget.
Den tekst jeg henter ud kan indeholde forskellige klasser. Det er ikke altid ValueClass.
Hvis du forestiller dig at teksten der bliver hentet ud er: "Der var en gang en mand som boede i ##StandardValue("Adresse", 2006)##. Han var ansat som tjenestemand og fik derfor ##BonusProcent("Tjenestemand", 10)##. Det var han meget glad for!"
Så vil jeg gerne kunne hente den tekst, finde tags og eksekverer dem og få værdien, og så erstatte selve tagget i teksten. Så fx ##BonusProcent("Tjenestemand", "Las Vegas department")## bliver erstattet af "15%" og ##StandardValue("Adresse", 2006)## bliver erstattet af "1st street, 12345 Las Vegas".
Hold da op det er besværligt. Kan det virkelig ikke gøres nemmere?
I PHP ville man bare gøre noget ligende sådan her: $value = eval(MetodeKald("Param1", Param1)); fx. eval(BonusProcent("Tjenestemand", 10)) og så ville $value være fx. 15%.
using System; using System.Reflection; using System.Text.RegularExpressions; using Microsoft.JScript; using Microsoft.JScript.Vsa;
public class Test { private static GlobalScope gs = VsaEngine.CreateEngineAndGetGlobalScope(false, new string[] { Assembly.GetExecutingAssembly().GetName().Name }); public static string Evaluate(string s) {
return Eval.JScriptEvaluate(s, gs.engine).ToString(); } public static string Address(int id) { return "DOTNET vej nr. " + id; } public static int BonusPercent(int salaryclass) { return (salaryclass - 5) / 2; } public static void Main(string[] args) { // simpelt Console.WriteLine(Evaluate("Test.Address(77)")); Console.WriteLine(Evaluate("Test.BonusPercent(18)")); // kombineret med regex string s = "bor ##Address(77)## og får ##BonusPercent(18)##% i bonus"; Console.WriteLine(s); string s2 = s; MatchCollection res = Regex.Matches(s,"(##)(.*?)(##)"); for(int i = 0; i < res.Count; i++) { s2 = s2.Replace(res[i].Groups[0].Value,Evaluate("Test." + res[i].Groups[2].Value)); } Console.WriteLine(s2); } }
Det er spændende ud. Jeg får dog følgende fejl når jeg prøver at teste det: The type or namespace name 'JScript' does not exist in the namespace 'Microsoft'
Jeg kan se at jeg kun har: CSharp, SqlServer, VisualBasic, VisualC og Win32 i Microsoft-namespacet.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.