Avatar billede martinsp Nybegynder
12. juli 2011 - 08:54 Der er 8 kommentarer og
1 løsning

void med enum i enum (parameter) alternativ

Hej Eksperter!

Jeg er ved at lave en .dll i c# .NET 2.0.

Jeg forsøger at lave en void, med en form for enum som parameter. Jeg har dog behov for en enum i en enum, hvilket ikke er muligt. Derfor søger jeg et alternativ.

Det endelige resultat skal fungere således:

void Request(Methods method)
{
...
}

new Request(Objects.getObject);

Metodernes struktur er sådan:

Methods
- Objects
  - getObject
  - setObject
- Users
  - getUser
  - setUser
...

Håber I forstår og kan hjælpe. :-)
Avatar billede paro Nybegynder
12. juli 2011 - 09:46 #1
Jeg er ikke 100% sikker på at jeg forstår hvad du gerne vil. Men jeg tror måske, at du har brug for en delegate.

public delegate void DelegateMethod();

void Request(DelegateMethod method)
{

}

Det er lang tid siden jeg selv har brugt delegates, men her er i hvert fald et link, der forklarer det lidt.
http://www.aspfree.com/c/a/C-Sharp/C-Sharp-Delegates-Explained/
Avatar billede martinsp Nybegynder
12. juli 2011 - 21:37 #2
Tak for svaret paro, men jeg tror ikke det kan bruges sådan, som jeg ønsker det.

Parameteren skal fungere som en enum, eks. Users.getUser eller Objects.setObject. Disse værdier ønsker jeg samlet i en form for enum.

enum Methods
{
Objects = enum { getObject, setObject, ... }
Users = enum { getUser, ... }
}
Ovenstående er ikke muligt, derfor søger jeg et alternativ, der giver samme resultat. Håber det var mere forståelige. :-)
Avatar billede martinsp Nybegynder
12. juli 2011 - 23:30 #3
Jeg har fundet en løsning, der mangler dog en lille finesse, hvis det skal fungere helt perfekt.

public class Methods
{
  public class Objects
  {
      public const int setObject = 1;
      public const int getObject = 2;
  }
  public class Users
  {
      public const int setUser = 3;
  }
}

public Authorize(string Key, string Secret, int Method)

Det fungerer kodemæssigt perfekt, men hvis det er muligt, ville det være rart, hvis den foreslog Methods-class'en, når man kalder funktionen, eftersom det skal være brugervenligt for "brugerne":
new Authorize.Authorize("", "", Authorize.Authorize.Methods.Objects.setObject);

...altså 'int Method' skal "pege" på Methods-class'en.
Avatar billede martinsp Nybegynder
14. juli 2011 - 12:46 #4
Jeg lukker tråden...
Avatar billede Syska Mester
16. juli 2011 - 19:25 #5
Problemet er jo stadig at du kan sende et tal med ... og dermed undgå "din måde" at gøre det på. Så hvis overstående er et framework, så tror jeg ikke det vil gøre det hele nemmere.

Er det ikke muligt du kan lave en overload af:
"Authorize" ?

Som enten tager en: Users enum eller Objects enum?

( Sådan ville jeg nok gøre det hvis jeg har forstået dit problem og din hensigt med at gøre det hele nemmere. Det virker nemlig som om du har en switch/case inde i din method.

Hvis overstående er rigtigt, så bryder du: http://en.wikipedia.org/wiki/Single_responsibility_principle

Yderligere får du nok en meget stor method body.

http://en.wikipedia.org/wiki/Open/closed_principle <- Dette bryder du nok også.


Grunden til at jeg nævner overstående er det lyder som om du laver et framework.

mvh
Avatar billede martinsp Nybegynder
16. juli 2011 - 21:10 #6
Hensigten var at lave en .dll, som nemt kunne implementeres i et hvilket som helst projekt, og via en enkelt linje new Authorize.Authorize("", "", Authorize.Authorize.Methods.Objects.setObject); lave en request til api-serveren, som returnerer noget response.

Som du har gættet, har jeg en switch i min method, men ville gerne være fri. Jeg har dog endnu ikke kunne lave en løsning, der fungerer uden.

Du må meget gerne komme med et eksempel til det du forklarer. :-)
Avatar billede Syska Mester
16. juli 2011 - 21:23 #7
Hvorfor ikke lave en "AuthorizeByXXX" method i stedet for at pakke flere methods ind i samme method?

Lyder mere eller mindre som om det eneste formål den sidste parameter er at angive hvad for en method den skal bruge, og det burde jo være i navnet.

Jeg kan ikke lige helt regne ud hvad din forskel er på "Objects" og "Users".

mvh
Avatar billede martinsp Nybegynder
16. juli 2011 - 23:58 #8
Hvis jeg forstår dig rigtigt, så får jeg en void for hver method?

Objects og Users var bare et eksempel. Med tiden kommer der flere methoder. Det kan sammenlignes lidt med Facebooks og Twitters api.

Grunden til jeg har methoder i methoder er, at når en client laver en request, så får clienten forslået samtlige methoder.

Jeg har lidt svært ved at se, hvordan det skal fungere, som jeg ønsker det, men det skyldes måske i virkeligheden, at jeg har svært ved at forklare, hvad jeg har brug for.
Avatar billede Syska Mester
17. juli 2011 - 01:11 #9
Ja, det kan meget vel være derfor. Jeg er ikke helt klar over hvad du ønsker, men jeg synes i hvert fald det virker som et rodet API.

At give en int med som parameter alt efter hvad metoder skal skal gøre, når du kan have et beskrivende method navn synes jeg virker mærkeligt.

Men du skal være velkommen til at prøve foreklare det bedre, så kan der helt sikkert findes en super smart løsning til dit problem.

mvh
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