Toon posts:

[C#] Hoe doe ik dit in C#

Pagina: 1
Acties:
  • 100 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hmm, het is een bekend techniekje, en het kan ook niet in alle talen, maar 't lijkt me dat 't in C# toch wel moet kunnen. Ik wil dus ongeveer zoiets doen:
code:
1
<object>.<variable>

Nu is het de bedoeling dat <variable> van 't type string is en de naam van een bepaalde functie (of eigenschap) op <object> is. Nu heb ik wel eens in een taal gezien dat het zo ging:
code:
1
<object>.(<variable>)

maar dat werkt dus niet zo best in C#.

Iemand een idee hoe het moet, en iemand een idee hoe je deze techniek noemt? Heb het wel eens geweten, maar ben 't vergeten :).

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Hoe bedoel je?

In variable zit dus eigenlijk de naam van een property of een functie van object?
Is dit wel mogelijk ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op dinsdag 25 juni 2002 21:40 schreef whoami het volgende:
Hoe bedoel je?

In variable zit dus eigenlijk de naam van een property of een functie van object?
Is dit wel mogelijk ?
Mjah, volgens mij moet het dus wel kunnen. Ik heb het tenminste wel eens in een taal gezien.

Het zou namelijk enorm schelen, want anders moet ik een uitgebreide if of switch structuur gaan schrijven om het goed te krijgen. En dat terwijl hij eigenlijk alleen de waarde van de variable om hoeft te zetten in een functienaam.

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
In een geparste geinterpreteerde taal als PHP kan dit wel ja :)

Met C# zal je het anders moeten oplossen, bv. met een switch-structuur. Als het een functie is kun je denk ik ook wel een HashTable van Delegates gebruiken, maar daar heb ik geen ervaring mee.

Verwijderd

Topicstarter
Op dinsdag 25 juni 2002 21:57 schreef marcusk het volgende:
In een geparste taal als PHP kan dit wel ja :)

Met C# zal je het anders moeten oplossen, bv. met een switch-structuur. Als het een functie is kun je denk ik ook wel een HashTable van Delegates gebruiken, maar daar heb ik geen ervaring mee.
Nogal onhandig dus want ik heb een enum van 9 items en een class met 10 eigenschappen (of public variables eigenlijk). De namen van de velden van de enum en de namen van die eigenschappen komen overeen (alleen 1'tje staat wel op de class, maar niet in de enum, maar die heb ik ook niet nodig). Nu zou ik dus een switch moeten maken met 9 cases. Lekker handig weer :(.

  • tomato
  • Registratie: November 1999
  • Niet online
Ik begrijp echt niet zo goed wat precies je probleem is, wat wil je precies bereiken hiermee?

Het lijkt nog het meest of je een soort dynamic class loading wilt maar dan voor de methods van je object... :?
Je weet toch altijd welke methods een object heeft?

Verwijderd

Topicstarter
Op dinsdag 25 juni 2002 22:25 schreef tomato het volgende:
Ik begrijp echt niet zo goed wat precies je probleem is, wat wil je precies bereiken hiermee?

Het lijkt nog het meest of je een soort dynamic class loading wilt maar dan voor de methods van je object... :?
Je weet toch altijd welke methods een object heeft?
Natuurlijk weet ik welke methods en/of properties er op m'n object staan. Maar ik weet niet welke method of welke property ik moet gebruiken, dat wordt dus bepaald door die variable (wat weer een parameter is van een functie).

  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 19-08 19:06
In sommige talen kun je idd een soortement van eval() of object.{$var} oid gebruiken, maar hier zul je het moeten oplossen met een mooiere structuur (ben C# n00b, dus weet ut zelf ook niet).

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

De manier die jij voorsteld is behoorlijk ranzig :)

Maar wat je zou kunnen doen is die switch in je object opnemen. Daar maak je dan een getProperty(String variable) methode van en je kunt het op bijna dezelfde manier gebruiken.

Probleem met jou voorstel is dat de compiler nooit kan zien wat voor type het teruggegeven object zou moeten zijn. In een geinterpreteerde taal (als php) maakt dat niet zo veel uit, maar als je wilt gaan compileren is het toch wel handig als dit van te voren bekend is.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • CyberThug
  • Registratie: Augustus 1999
  • Laatst online: 10:44

CyberThug

Formatting C: 1%

Ik weet dat hezelfde in VB.NET wel mogelijk is. Daar bestaat namelijk de functie CallByName(). Zoek maar eens in MSDN.

Succes. :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Op dinsdag 25 juni 2002 22:40 schreef CyberThug het volgende:
Ik weet dat hezelfde in VB.NET wel mogelijk is. Daar bestaat namelijk de functie CallByName(). Zoek maar eens in MSDN.

Succes. :)
Als het in VB.NET kan, dan kan het hoogstwaarschijnlijk ook in c#... 'k Ga eens die functie opzoeken.

Even opgezocht en ze is volgens mij VB.NET only. Ik vind dit eigenlijk redelijk ranzig en vind het mooi dat dat niet in C# zit. :)

Wat ik wel vreemd vind, is dat het geen member functie is van een of andere class. Ik dacht dat .NET volledig OO was?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op dinsdag 25 juni 2002 22:41 schreef whoami het volgende:

[..]

Als het in VB.NET kan, dan kan het hoogstwaarschijnlijk ook in c#... 'k Ga eens die functie opzoeken.
Hmmz, met Filtered By op Visual C# and related vind ik niks, met filtered by op Visual Basic and related wel. ffies lezen.

Hmmz, ffies gekeken:
UseCallType
Required. An enumeration member of type Microsoft.VisualBasic.CallType representing the type of procedure being called. The value of CallType can be Method, Get, or Set.
Lijkt er dus op dat het een compatibiliteits functie is aangezien je dus de namespace Microsoft.VisualBasic moet gebruiken. Die kan je volgens mij niet eens importen in C#.

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Het kan wel met reflection bedenk ik me nu (denk dat CallByName ook zo werkt):
code:
1
2
3
4
5
6
7
8
9
10
11
class Blaat
{
    public int val1;
    public int val2;
    public int val3;
}
...
Type blaattype = typeof(Blaat);
FieldInfo f = blaattype.GetField("val1");
Blaat blaat = new Blaat();
int value = f.GetValue(blaat);

(niet getest)

[edit]
Misschien is het beter om eens goed te kijken naar het ontwerp van je programma als zoiets nodig is ;)

Verwijderd

Topicstarter
Op dinsdag 25 juni 2002 22:49 schreef marcusk het volgende:
Het kan wel met reflection bedenk ik me nu (denk dat CallByName ook zo werkt):
code:
1
2
3
4
5
6
7
8
9
10
11
class Blaat
{
    public int val1;
    public int val2;
    public int val3;
}
...
Type blaattype = typeof(Blaat);
FieldInfo f = blaattype.GetField("val1");
Blaat blaat = new Blaat();
int value = f.GetValue(blaat);

(niet getest)

[edit]
Misschien is het beter om eens goed te kijken naar het ontwerp van je programma als zoiets nodig is ;)
Hmmz, het lijkt te werken. Moet het alleen nog ffies uitproberen, maar dat doe ik morgen wel. In ieder geval geen compile fouten :).

  • tomato
  • Registratie: November 1999
  • Niet online
Reflection is wel leuk en het is natuurlijk helemaal leuk dat je nu je probleem opgelost ziet, maar ik zou toch willen zeggen dat van alles wat marcusk zei, dit het belangrijkste was:
marcusk: Misschien is het beter om eens goed te kijken naar het ontwerp van je programma als zoiets nodig is ;)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op dinsdag 25 juni 2002 23:06 schreef tomato het volgende:
Reflection is wel leuk en het is natuurlijk helemaal leuk dat je nu je probleem opgelost ziet, maar ik zou toch willen zeggen dat van alles wat marcusk zei, dit het belangrijkste was:
[..]
Ik sta hier ook 100% achter. Ik heb nog nooit de behoefte gehad aan zo`n constructie (kan natuurlijk ook wat zeggen over mijn behoeftes, maar dat terzijde ;) ) dus ik denk inderdaad dat je eens goed moet kijken naar je ontwerp.

Verwijderd

Topicstarter
Nou, ik had het dus nodig voor een aantal permissie flags. Ik heb dus een class gemaakt dat 10 eigenschappen bevat. 1 string en 9 booleans. Die string bevat een bepaalde dir op de schijf, en de 9 booleans beschrijven de Read, Write etc flags.

Nou moest ik die 9 booleans ergens anders weer benaderen. Daar had ik dus een functie voor geschreven genaamt CheckPermission. Die functie moest dus controleren of voor een bepaalde dir een bepaalde permissie is ingesteld. Dus deze had als parameters:
code:
1
private bool CheckPermissions(string absolutedir, PermissionFlags flag)

Waarbij PermissionFlags dus een enum is die weer diezelfde namen voor die flags bevat.

Dat leek mij dus een aardige oplossing voor het probleem. Maar om nu voor elke waarde in de PermissionFlags enum een case of if te maken leek me een beetje moeilijk als het ook makkelijker kan, of zie ik dat verkeert?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Denk je niet dat de sleutel tot de oplossing in de 9 boolean zit en niet in het controleren van deze booleans?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op dinsdag 25 juni 2002 23:14 schreef jmezach het volgende:
Dat leek mij dus een aardige oplossing voor het probleem. Maar om nu voor elke waarde in de PermissionFlags enum een case of if te maken leek me een beetje moeilijk als het ook makkelijker kan, of zie ik dat verkeerd?
Het lijkt mij het best om een GetPermissions(string dir) methode te maken die een Permissions (of hoe je em ook genoemd hebt) object teruggeeft. De aanroepende methode kan dan checken of de flag geset is (liefst ook met properties ipv publieke member vars).

Verwijderd

Topicstarter
Op dinsdag 25 juni 2002 23:29 schreef marcusk het volgende:

[..]

Het lijkt mij het best om een GetPermissions(string dir) methode te maken die een Permissions (of hoe je em ook genoemd hebt) object teruggeeft. De aanroepende methode kan dan checken of de flag geset is (liefst ook met properties ipv publieke member vars).
Ehm, dat zou inderdaad nog kunnen. Overigens nog even een vraagje wat betreft je laatste opmerking. Wat is nu precies het voordeel om gebruik te maken van properties, in tegenstelling tot het gebruik van public variables. Maakt het een wezenlijk verschil?

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op woensdag 26 juni 2002 00:25 schreef jmezach het volgende:
Wat is nu precies het voordeel om gebruik te maken van properties, in tegenstelling tot het gebruik van public variables. Maakt het een wezenlijk verschil?
Properties zijn netter omdat je ten eerste de controle hebt over het gebruik ervan: je kunt aangeven of een property read-only of zelf write-only moet zijn. Dit maakt het programma minder fout-gevoelig. Ten tweede kun je m.b.v. properties zorgen dat er een bepaalde actie wordt uitgevoerd als de waarde aangepast wordt (denk bijvoorbeeld aan een positie-prop. voor een GUI-control). Misschien heb je deze functionaliteit nu niet nodig, maar met properties het is het iig makkelijk om het later toe te voegen.

Verwijderd

Topicstarter
Op woensdag 26 juni 2002 00:36 schreef marcusk het volgende:

[..]

Properties zijn netter omdat je ten eerste de controle hebt over het gebruik ervan: je kunt aangeven of een property read-only of zelf write-only moet zijn. Dit maakt het programma minder fout-gevoelig. Ten tweede kun je m.b.v. properties zorgen dat er een bepaalde actie wordt uitgevoerd als de waarde aangepast wordt (denk bijvoorbeeld aan een positie-prop. voor een GUI-control). Misschien heb je deze functionaliteit nu niet nodig, maar met properties het is het iig makkelijk om het later toe te voegen.
Okeej, zit wat in, maar heb die functionaliteit inderdaad niet nodig op 't moment. Maar 't kan soms inderdaad handig zijn. Overigens heeft m'n programma niet eens een GUI. Tenminste, het hoofd gedeelte niet.

  • tomato
  • Registratie: November 1999
  • Niet online
Properties zijn eigenlijk de C# manier om getters en setters te implementeren. Het gebruik van getters en setters is van wezenlijk belang als je het over data encapsulation hebt. Dit is vrij logisch, je 'verbergt' je member variabele binnen je object, de buitenwereld kan er alleen bij via een getter of een setter.

Data encapsulation wordt toch wel als een van de belangrijkste eigenschappen van object georienteerd programmeren gezien (om verschillende redenen) en aangezien je in C# programmeert neem ik aan dat je dit object georienteerd wilt aanpakken.

Omdat je in een object georienteerd ontwerp vrijwel niet om getters en setters heen kunt is er wel wat voor te zeggen om hiervoor in de taal een constructie op te nemen. Sommigen vinden dit mooi, sommigen niet. In C# is hier wel voor gekozen, in bijvoorbeeld Java niet (hier zul je je getters en setters zelf moeten implementeren).

Ik weet uit mijn hoofd niet zeker hoe het in de .NET IL zit, maar ik vermoed dat properties in C# een stuje syntactic sugar zijn, die door de compiler dus vertaald worden naar 'gewone' methods.

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
jmezach:
Overigens heeft m'n programma niet eens een GUI. Tenminste, het hoofd gedeelte niet.
Het was ook slechts een voorbeeld (zelf heb ik nog nooit een GUI gebakken met .NET :))
Okeej, zit wat in, maar heb die functionaliteit inderdaad niet nodig op 't moment.
Met 'die functionaliteit' bedoelde ik alleen het tweede punt. Het eerste punt geld altijd.
tomato:
Ik weet uit mijn hoofd niet zeker hoe het in de .NET IL zit, maar ik vermoed dat properties in C# een stuje syntactic sugar zijn, die door de compiler dus vertaald worden naar 'gewone' methods.
Klopt idd: er worden gewoon methoden gemaakt met get_ en set_ voor de namen van de props en wat speciale meta-info.

  • tomato
  • Registratie: November 1999
  • Niet online
jmezach: Okeej, zit wat in, maar heb die functionaliteit inderdaad niet nodig op 't moment.
Het is 'good practice' om altijd gebruik te maken van data encapsulation, in C# betekent dit dus onder andere gebruik te maken van properties.
Gebruik nooit public of protected variabelen, maar maak deze altijd private en gebruik public of protected getters en setters waar nodig.

Verwijderd

jmezach: mag ik je een tip geven?

Je hebt de afgelopen weken misschien wel 100 vragen over .NET, C# en aanverwante zaken gevraagd. Niks mis mee, maar als iemand apotjewijd-achtige trekjes gaat vertonen vraag ik me altijd af of die persoon wellicht beter af is met een goed boek. Veel vragen die je stelt zijn namelijk na het lezen van een goed boek over de materie zo te beantwoorden en in de uitstekende help kijken van .NET is ook erg simpel.

Ik zou je Programming C# van Jesse Liberty (O Reilly) willen aanraden. Echt een van de beste boeken over een programmeertaal, ik denk zelfs nog wel beter dan Kernighan-Ritchie's C-the programming language.

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Ik vraag me toch nog altijd af hoe het komt dat die VB.NET functie:
code:
1
CallByName

geen member functie is van één of andere class. Ik dacht dat .NET volledig OO was?

https://fgheysels.github.io/


Verwijderd

Op woensdag 26 juni 2002 10:46 schreef whoami het volgende:
Ik vraag me toch nog altijd af hoe het komt dat die VB.NET functie:
code:
1
CallByName

geen member functie is van één of andere class. Ik dacht dat .NET volledig OO was?
Het is een taalfunctie. VB(.NET) heeft er wel meer. Niets om je zorgen om te maken, het zijn juist deze functies die VB(.NET) soms krachtiger maken dan andere talen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Op woensdag 26 juni 2002 11:21 schreef Otis het volgende:

Het is een taalfunctie. VB(.NET) heeft er wel meer. Niets om je zorgen om te maken, het zijn juist deze functies die VB(.NET) soms krachtiger maken dan andere talen.
Als het een taalfunctie is, kunnen we dan stellen dat VB.NET niet volledig OO is, en dus eigenlijk zoals C++ hybride is?

https://fgheysels.github.io/


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
whoami: Als het een taalfunctie is, kunnen we dan stellen dat VB.NET niet volledig OO is, en dus eigenlijk zoals C++ hybride is?
Het is een 'run-time member function'. Dit is in feite een soort public static methode, die zich niet in een klasse bevindt. Dit is inderdaad toegestaan in .NET IL (en dus niet in C#).

Een voorbeeldje:
code:
1
2
3
4
5
6
7
8
Imports Microsoft.VisualBasic.Strings

Module Beep
  Function Main() as Integer
    System.Console.Out.WriteLine( Trim("   Dit is een voorbeeld  "))
    Return 0
  End Function
End Module

Trim is hier zo'n functie, die zich in de namespace Microsoft.VisualBasic.Strings bevindt. Als je deze niet importeert, werkt het niet.

Hier zie je de IL van dit stukje code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.method public static int32  Main() cil managed
{
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) 
  // Code size   26 (0x1a)
  .maxstack  2
  .locals init (int32 V_0)
  IL_0000:  call     class [mscorlib]System.IO.TextWriter [mscorlib]System.Console::get_Out()
  IL_0005:  ldstr   "   Dit is een voorbeeld  "
  IL_000a:  call     string [Microsoft.VisualBasic]Microsoft.VisualBasic.Strings::Trim(string)
  IL_000f:  callvirt   instance void [mscorlib]System.IO.TextWriter::WriteLine(string)
  IL_0014:  ldc.i4.0
  IL_0015:  stloc.0
  IL_0016:  br.s     IL_0018
  IL_0018:  ldloc.0
  IL_0019:  ret
}

en dit het signature van die Trim functie:
code:
1
.method public static string  Trim(string str) cil managed

Als je een probleem hebt met deze static functions heb je dus een probleem met IL en niet alleen met VB .NET (volgens mij kan dit ook gewoon in C++) ;) .

Ik vond hier een docje waarin dit bijvoorbeeld staat (leuk om even door te lezen!)

http://www.pearsonptg.com/samplechapter/067232153X.pdf
you can use IL to do things that you can t do with C#. For example, in IL, you can create global functions and call them from within IL.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik ben eigenlijk wel benieuwd wat een C# decompiler met een assembly met dergelijke globale methode doet ;) . Ik krijg die gratis decompiler helaas niet aan de praat omdat je daarvoor VisualStudio nodig hebt volgens mij.

Ik vermoed dat je dergelijke functies dus ook niet aan kunt roepen vanuit C#, maar dat weet ik niet zeker. Je kan natuurlijk wel een wrapper in VB .NET schrijven ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Op woensdag 26 juni 2002 12:55 schreef mbravenboer het volgende:
Ik ben eigenlijk wel benieuwd wat een C# decompiler met een assembly met degelijke globale methoden doet ;) . Ik krijg die gratis decompiler helaas niet aan de praat omdat je daarvoor VisualStudio nodig hebt volgens mij.

Ik vermoed dat je dergelijke functies dus ook niet aan kunt roepen vanuit C#, maar dat weet ik niet zeker. Je kan natuurlijk wel een wrapper in VB .NET schrijven ;) .
...

edit:

Ehmz, verkeerd gelezen >:)
Pagina: 1