[C#] Dynamische if met string

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Arise
  • Registratie: November 2007
  • Laatst online: 19-07-2022
Ik zou het volgende willen bereiken met .Net 2.0

string str = "1 == 1";
if (str)
{
}

Ben al gans de ochtend aan het googlen maar dat levert voorlopig weinig op...

Acties:
  • 0 Henk 'm!

  • beany
  • Registratie: Juni 2001
  • Laatst online: 17-09 13:56

beany

Meeheheheheh

Ehm, wat wil je dan precies bereiken? Wat doet ie niet? Of juist wel?

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 20:40
je kan toch de karakters uitlezen en er zelf een interperter voor schrijven?

Dus

C#:
1
2
3
4
5
6
7
string commando = "1 == 1";

if (commando.contains("=="))
{
string[] array = commando.split("==");
if (array[0].equals(array[1])) return true;
}

Even niets...


Acties:
  • 0 Henk 'm!

  • Ste7en
  • Registratie: Januari 2002
  • Laatst online: 29-05-2024
code:
1
2
3
4
5
6
int A = 1;
int B = 2;
if (A == B)
{
...
}

Zoiets lijkt me toch werken?

@Amras,
Dat snap ik, alleen in de string worden nu gewoon twee integers gebruikt, vandaar :)

Maar het is misschien handiger als de TS vermeldt wat hij hiermee wil.

[ Voor 48% gewijzigd door Ste7en op 15-09-2009 12:56 ]


Acties:
  • 0 Henk 'm!

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 16:12
Ste7en schreef op dinsdag 15 september 2009 @ 12:36:
code:
1
2
3
4
5
6
int A = 1;
int B = 2;
if (A == B)
{
...
}

Zoiets lijkt me toch werken?
Dat werkt wel ja, maar de TS probeert een string als conditie te gebruiken in zijn if-statement, terwijl dit de conditie naar een boolean moet evalueren.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
Wat wil je eigenlijk precies doen ?
Schets de situatie eens, misschien is er een andere (betere) oplossing voor jouw probleem

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Simpelweg wil je dus met een string aangeven hoe je de conditie wil maken? Lijkt me stug of dat ooit zou werken want stel de syntax van de conditie is fout, dan hoor je een syntax error te krijgen maar die zal je niet vinden in een string.

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

thijs_cramer schreef op dinsdag 15 september 2009 @ 12:34:
je kan toch de karakters uitlezen en er zelf een interperter voor schrijven?
Ik zou over beide leden wel even een trim() overheen halen.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als je die string sowieso in code opbouwt zou ik een expressieboom gebruiken. Wellicht dat een string voor jou logischer lijkt omdat dat het meest lijkt op wat je intypt in je IDE, maar in dat formaat kan een programma er weinig mee. De compiler zet een sourcefile ook eerst om in een syntax tree.

Maak een interface Expression, met een method Eval() die het resultaat retourneert. Maak een EqualOperator die Expression implementeert, die twee Expression objecten bevat - een voor de linkerkant en een voor de rechterkant van de ==. Maar ook een Value class, die in z'n Eval() gewoon een waarde retourneert. In de implementatie van EqualOperator.Eval() doe je dan gewoon iets als: "return left.Eval() == right.Eval()". En breidt dat uit met eventuele andere operaties die je nodig hebt in de expressie.

[ Voor 5% gewijzigd door .oisyn op 15-09-2009 13:10 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Arise
  • Registratie: November 2007
  • Laatst online: 19-07-2022
Bedoeling is om at runtime eigenlijk die if te kunnen bepalen. De string zou at runtime uit de db worden gehaald. Die if kan dan ook vanalles bevatten, ook functies als .contains() enzo.

nog een voorbeeldje (gesteld dat die dataset al bestaat)

string str = "DataSet1.DataTable1.Rows[0][0].Contains('@') && int.Parse(DataSet1.DataTable1.Rows[0][0].ToString()) != 1";

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:26

Creepy

Tactical Espionage Splatterer

Je wilt dus wat in PHP eval() heet begrijp ik. In de meeste gevallen heb je dit echt niet nodig en vaak betekent het ook een slecht ontwerp van je code. Heb je dan ook een specifieke reden om dit te gebruiken en waar ga je het precies voor gebruiken? Misschien dat het op een andere manier is op te lossen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Arise
  • Registratie: November 2007
  • Laatst online: 19-07-2022
Het dient voor een intern online enquete systeem, de if dient dan om vraagsprongen te kunnen programmeren. Bepalen dus of een bepaalde vraag al dan niet moet worden getoond, het verleden heeft al uitgewezen dat dit vaak erg complexe situaties zijn en tot nu toe zit ik dan maar wat manueel in de code te prutsen. Aangezien het toch voor intern gebruik is zie ik geen problemen in het onveilige ervan en het lijkt me toch het meest flexibele systeem...

Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 23:06
CodeDOM: http://msdn.microsoft.com/en-us/library/y2k85ax6.aspx kan dat doen. Yet, waarschijnlijk slecht ontwerp.

Acties:
  • 0 Henk 'm!

  • Alex
  • Registratie: Juli 2001
  • Laatst online: 20-08 21:38
Ik snap dat stukje slecht ontwerp echt niet. Er zijn 100-en mogelijkheden zijn om zoiets op te lossen en die zijn allemaal 'slecht ontwerp'? De vraag van de topic starter aan de orde van de dag in de DSL wereld. Maar ook bij het schrijven van rule-engines bijvoorbeeld.
Een andere vraag is relevant: wat wil je hiermee bereiken, TS?

Overigens vind ik suggesties als: Gebruik de CodeDOM pas wijzen op slecht ontwerp. Dat ding is ongelooflijk complex, heeft schrikbarende side-effect en vereist een dermate hoge skill-level van zaken als .NET, CLR en compilers dat ik niemand zonder ervaring in deze richting dit aanraad. Liever zie ik dan de simpele oplossing die .oisyn aanraad. Deze maakt de oplossing niet moeilijker en lost het op zoals een simpele compiler het op zou lossen: oftewel, richting de kern van het probleem.

Het core-team van mijn werkgever waagt zich aan bovenstaande zaken, maar beperkt zich tot een subset van bovengenoemde functionaliteiten. Waarom? Op sommige moment wil je Emit's en Eval's doen. Dit verhoogt efficientie van de software en geeft een hoop configuratie opties. Zolang je maar op de hoogte bent van hoe een statische getypeerde taal om gaat met dergelijke strings, hoe deze vervolgens om te zetten zijn naar code(compiler-leer is daarbij geen overbodige luxe) en met de mogelijke performance penalty in je achterhoofd.

Nogmaals erg jammer dat het op 'slecht design' wordt gegooid. Er is meer in de wereld dan statische getypeerde talen, denk aan Javascript / ECMAScript of aan Python. Alles heeft z'n toepassing.

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
+1 voor DSL, maar ik denk dat de topic starter de afkorting niet kent. Het staat voor "Domain Specific Language", en slaat op taaltjes die 1 klein doel hebben. Bijvoorbeeld Regex voor het matchen van strings. .oisyn suggeert ook om een DSL te gebruiken, als hij opmerkt dat je eigenlijk een interpreter wil schrijven.

Wat de TS dus concreet nodig heeft zijn de DSL Tools voor Visual Studio

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Nou ja, iemand vraag om een evaluator en jij roept "slecht ontwerp" ?
Iemand al gedacht dat die string misschien user input/setting is voor validatie, berekeningen in een pakket etc. etc.?

[ Voor 21% gewijzigd door Verwijderd op 16-09-2009 12:34 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op woensdag 16 september 2009 @ 12:22:
[...]
Iemand al gedacht dat die string misschien user input/setting is voor validatie, berekeningen in een pakket etc. etc.?
Ja en die user-input dan maar blind door een eval functie gooien, getuigt meestal niet echt van goed ontwerp.

Juist bij dingen als user-input wil je niet echt een pure eval functie, een simpele parser geeft je dan dus veel meer controle

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Woy schreef op woensdag 16 september 2009 @ 12:51:
[...]

Ja en die user-input dan maar blind door een eval functie gooien, getuigt meestal niet echt van goed ontwerp.

Juist bij dingen als user-input wil je niet echt een pure eval functie, een simpele parser geeft je dan dus veel meer controle
Jazeker, alleen TS geeft simpel aan wat ie wil bereiken, niet hoe. Het spreekt voor zich dat er een parser tussen moet.

  • Alex
  • Registratie: Juli 2001
  • Laatst online: 20-08 21:38
Goh, dat schreef ik gelukkig niet al :+

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Echter heeft niemand het er in het topic over dat "op string gebaseerde beslissingen" slecht zijn, maar alleen dat een "PHP achtige eval" vaak duid op slecht ontwerp. Dus ik snap niet waar jullie nou over vallen!

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Arise schreef op dinsdag 15 september 2009 @ 13:33:
Het dient voor een intern online enquete systeem, de if dient dan om vraagsprongen te kunnen programmeren. Bepalen dus of een bepaalde vraag al dan niet moet worden getoond, het verleden heeft al uitgewezen dat dit vaak erg complexe situaties zijn en tot nu toe zit ik dan maar wat manueel in de code te prutsen.
Klinkt als een small-scale business process management system. In de basis heb je een connected directed graph met nodes. Door zo'n node heen stappen kan gebruikersinteractie vereisen (een vraag die gesteld wordt) of de automatische evaluatie van één of andere expressie vereisen (beslissen wat de volgende vraag wordt) aan de hand waarvan het exit-path naar een volgende node gekozen wordt.

Wat ik zou doen is een paar simpele graph-traversal classes maken die om kunnen gaan met een IGraphNode interface. Vervolgens wil je met System.Reflection's InstanceFromAndUnwrap() uit een dynamisch inlaadbare assembly een concrete node (die IGraphNode implementeert) met gecompileerde logica kunnen laden. Op die manier hoef je helemaal niets in strings op te slaan of at runtime (toch nog gelimiteerde) custom expressie bomen evalueren, maar kun je gewoon dynamisch het juiste node type uit een assembly plukken.

Als die expressies namelijk zo complex worden als je claimt, dan wil je dat toch niet gaan configureren in strings, want dat stinkt naar een anti-pattern.

Je schrijft dus verschillende eenheden aan business code uit in atomaire graph nodes en de opbouw van deze nodes naar een enquete graph kun je dan nog altijd in een XML file of in een database opslaan.


offtopic:
Dus ja: Van het hele ding zoals het nu uit gedacht is kun je inderdaad stellen dat het een slecht design is.

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Volgens mij heb je niet per se reflection nodig om dit aan de praat te krijgen hoor. De soort vragen die je hebt zijn redelijk beperkt.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • jan-marten
  • Registratie: September 2000
  • Laatst online: 16-09 14:45
De snelste manier om nog iets binnen .NET te 'evalueren' (string-based) is volgens mij via het MsScriptControl. Deze moet je tegenwoordig wel even apart installeren en daarna een referentie leggen naar de msscript.ocx-file. Ding is hier te vinden: klikkerdeklik.

Anders kun je reflection nog overwegen maar dat is best wel een stuk trager (je moet intern een heel programma compileren en draaien wat nogal wat tijd in beslag neemt). Het voordeel tov de msscript-oplossing is dat reflection wel in 64-bit draait. Mocht je dus een server applicatie scrhijven dan moet je hier eventueel wat rekening mee houden.

Acties:
  • 0 Henk 'm!

  • Arise
  • Registratie: November 2007
  • Laatst online: 19-07-2022
Heb het uiteindelijk opgelost door JScript op te roepen, die dit wel ondersteund, zie : http://www.west-wind.com/WebLog/posts/10688.aspx

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Je bent een onderhoudsnachtmerrie aan het maken. Ik zou toch sterk overwegen om het probleem structureel op te lossen.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Wacht nog een paar maandjes en het gaat wel:

http://community.bartdesm...inq-expressions-v4-0.aspx

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Arise schreef op vrijdag 18 september 2009 @ 08:34:
Heb het uiteindelijk opgelost door JScript op te roepen, die dit wel ondersteund, zie : http://www.west-wind.com/WebLog/posts/10688.aspx
Je gaat een feature (VsaEngine) gebruiken die sinds VS 2005 bewust deprecated gemaakt is. Het nieuwe alternatief (JScriptCodeProvider) vreet JScript.NET code (wat strict genomen niet javascript is), die je sinds VS 2008 niet meer met de IDE kunt compileren, maar waarvoor je zelf de command line compiler moet gebruiken.

Begrijp ik het zo goed?

Wauw! Wat een oplossing zeg... :')

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Arise schreef op vrijdag 18 september 2009 @ 08:34:
Heb het uiteindelijk opgelost door JScript op te roepen, die dit wel ondersteund, zie : http://www.west-wind.com/WebLog/posts/10688.aspx
Je hebt een C#-programma waarin je JScript aanroept om eval te kunnen gebruiken, alleen om je vergelijking in een string te kunnen zetten en in een if te kunnen gebruiken? :/

Serieus, ga eens denken over een herontwerp als je dat soort ranzige hacks moet toepassen alleen om jouw eerste ontwerp werkend te krijgen. Eval is niet, zoals veel mensen zullen zeggen, per definitie evil; er zijn best valide toepassingen voor te verzinnen. Maar meestal is er toch écht een veel betere oplossing voor...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1