Avatar billede Slettet bruger
27. april 2008 - 16:56 Der er 13 kommentarer og
1 løsning

Tilgå variabel ud fra string

Hejsa!

Hvordan kan jeg tilgå en variabel ud fra en string?


Eksempel - jeg ønsker at printe "test" (indholdet af EnKlasseinstans.Noget):

EnKlasseinstans.Noget = "test";
MinStreng = "Noget";
Console.WriteLine(EnKlasseinstans.HVAD_GOER_JEG_HER(MinStreng));
Avatar billede arne_v Ekspert
27. april 2008 - 17:04 #1
Dårlig løsning: bruger reflection

God løsning: redesigner f.eks. skifter fra multiple propertie til en property af type Dictionary<>
Avatar billede arne_v Ekspert
27. april 2008 - 17:07 #2
utestet:

EnKlasseinstans.GetType().GetProperty(MinStreng).GetValue(EnKlasseinstans, null)
Avatar billede Slettet bruger
27. april 2008 - 17:15 #3
Jeg ved, det ikke er en ideel løsning... Men jeg er i gang med at lave min egen condition parser (eks.: a=2&kdf=45|dd=false => true), og den skal kunne parse ud fra en forskellige elementers egenskaber.
Forresten: Findes der en indbygget parser til string-baserede conditions?
Avatar billede arne_v Ekspert
27. april 2008 - 17:43 #4
Der er et par muligheder:

1) generere C# code on the fly og compile og load den

2) kalde JavaScript eval funktion
Avatar billede Slettet bruger
27. april 2008 - 17:45 #5
Hm... Ja... Det bliver lidt over mit nuværende niveau, uanset hvad jeg vælger. Jeg tror, jeg finder en anden løsning og dropper parseren. Tager alligevel alt for meget tid og tålmodighed for mig!
Du kan jo smide et svar, hvis du vil have lidt til samlingen ;P
Avatar billede arne_v Ekspert
27. april 2008 - 17:50 #6
Det er nu ikke så avanceret.

Eksempel:

using System;
using System.Reflection;
using System.CodeDom.Compiler;

using Microsoft.CSharp;
using Microsoft.JScript;

namespace E
{
    public interface IJS
    {
        double Eval(string expr);
    }
    public class JS
    {
        private static IJS engine;
        static JS()
        {
            string src = "import System; import E; public class C implements IJS { public function Eval(expr : String) : Double { return eval(expr); } }";
            CodeDomProvider comp = new JScriptCodeProvider();
            CompilerParameters param = new CompilerParameters();
            param.GenerateInMemory = true;
            param.ReferencedAssemblies.Add("System.dll");
            param.ReferencedAssemblies.Add(System.Reflection.Assembly.GetExecutingAssembly().Location);
            CompilerResults res = comp.CompileAssemblyFromSource(param, src);
            Assembly asm = res.CompiledAssembly;
            engine = (IJS)asm.CreateInstance("C");
        }
        public static double Eval(string expr)
        {
            return engine.Eval(expr);
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(JS.Eval("2+2+2"));
            Console.WriteLine(JS.Eval("2*2+2*2"));
        }
    }
}
Avatar billede Slettet bruger
27. april 2008 - 18:02 #7
Tja, det kan du jo sagtens sige, men det er ikke så smart, hvis jeg ikke ved, hvad jeg laver - og jeg fatter ingenting af ovenstående. Så vil jeg hellere gøre den på en enklere måde og slippe for alt bøvlet med min egen parser.

Så har jeg faktisk et andet lille spørgsmål i stedet: Kan man overskrive en klasseinstans' metoder fra et andet scope?
Avatar billede arne_v Ekspert
27. april 2008 - 18:10 #8
Hvad mener du med "fra et andet scope" ?
Avatar billede Slettet bruger
27. april 2008 - 19:23 #9
En anden placering, et andet objekt.
Avatar billede arne_v Ekspert
27. april 2008 - 20:41 #10
En anden klasse ?

Nej - kun hvis den anden klasse extender den første og det er en virtual metode.
Avatar billede Slettet bruger
28. april 2008 - 09:08 #11
Hm, ok. Så må jeg prøve at rode med noget nedarvning i stedet. Gogo static :P Men det behøves du nu ikke rodes ind i. Gief teh svar, plix!
Avatar billede arne_v Ekspert
28. april 2008 - 15:38 #12
svar
Avatar billede arne_v Ekspert
28. april 2008 - 15:40 #13
En anden mulighed (men igen i den lidt avancerede afdeling) vill vaere noget
DI og/eller AOP.
Avatar billede Slettet bruger
28. april 2008 - 16:54 #14
Har jeg så aldrig hørt om :) Så ja, lidt for svært for mig. Jeg finder ud af noget andet. Takker.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester