26. januar 2007 - 13:06Der er
23 kommentarer og 1 løsning
Vælge dll fil i switch case
Hej
Jeg sidder her med noget der helt sikkert er et newbie spørgsmål.
Jeg har nogle forskellige dll filer. Jeg skal bruge én af dem, men jeg ved først hvilken, når brugeren har valgt den.
Jeg har derfor prøvet at sætte en switch case op på brugerens input, men der sker jo så bare det, at instans jeg opretter kun eksisterer i min switch og derfor ikke kan bruges videre udenfor switchen.
Bump.... (Gør lige det her for at se hvor pokker mit spørgsmål blev af. Den er ikke kommet i listen over spørgsmål, kan kun finde den i listen over nyeste spørgsmål :-S)
Det lyder som om din variabel der registrerer brugerens valg via "switch" udtrykket bliver erklæret inde i selve "case" udtrykket. Prøv se mine eksempler nedenfor:
1) Dette kan ikke kompileres da strFile ikke kan bruges efter switch.
int switchArgument = 0;
switch (switchArgument) { case 0: //Erklærer strFile in i switch string strFile = "File01"; break; case 1: strFile = "File02"; break; default: strFile = "File03"; break; }
//FEJL, for strFile er erklæret inde scopet af switch System.Console.WriteLine(strFile);
Så hvis du i stedet erklærer strFile-variablen før switch-udtrykket, kan du fint benytte den bagefter og checke for brugerens valg. Altså:
2) Dette kompilerer og køres fint.
int switchArgument = 0;
//Erklærer string file inden switch string strFile = "";
Ja det er lige netop mit problem. Men da de ikke bare er en simpel type (string) jeg skal ha' erklæret, men en instans af en klasse fra et namespace, hvordan skal jeg så erklære den før min switc?
Hmmm,,, jeg kan ikke få nogle af jeres (helt sikkert rigtige) svar til at virke.
Jeg roder lige lidt med det, men jeg skal jo nok kigge på at lade dem nedarve fra samme klasse/interface, men jeg har bare aldrig gjort det før, så jeg har nok lige lidt læsning inden jeg kan vurdere om det er løsningen.
Ud fra navnene at dømme, har de 3 klasser lidt ala samme funktionalitet, eller i hvert fald nogle fællestræk, så det burde ikke være umuligt at bygge et interface på.
Nej det er det garanteret heller ikke,,, men jeg kan bare ikke lige se det :-(
Prøver lige med lidt kode. Her er en remotecontrol til media player:
namespace WMRemoteControl { public class Remote { [DllImport("User32.dll")] public static extern Int32 SendMessage(Int32 hWnd, int msn, int wParam, int lParam);
private const int WM_COMMAND = 0x111;
public void PlayPause(Int32 MyHandle) { SendMessage(MyHandle, WM_COMMAND, 0x00004978, 0x00000000); }
public void Stop(Int32 MyHandle) { SendMessage(MyHandle, WM_COMMAND, 0x00004979, 0x00000000); }
public void Next(Int32 MyHandle) { SendMessage(MyHandle, WM_COMMAND, 0x0000497B, 0x00000000); }
public void Previous(Int32 MyHandle) { SendMessage(MyHandle, WM_COMMAND, 0x0000497A, 0x00000000); }
public void Volume(Int32 MyHandle, string Vol) { switch(Vol.ToUpper()) { case "UP": SendMessage(MyHandle, WM_COMMAND, 0x0000497F, 0x00000000); break; case "DOWN": SendMessage(MyHandle, WM_COMMAND, 0x00004980, 0x00000000); break; case "MUTE": SendMessage(MyHandle, WM_COMMAND, 0x00004981, 0x00000000); break; default: break; } }
Altså det jeg ligesom synes var smart ved den her måde er, at når alt kode alligevel skal skrives om hver gang, så bare lave det som hver sin assembly, for så kan min kammerat bare skrive en til eks. BSPlayer som jeg bare kan adde i mit projekt. Altså han kan skrive den uden adgang til in superklasse.
Men det kan godt være hele strukturen i projektet lige skal revurderes. Det er heldigvis bare for "sjov" jeg laver den, så der er tid nok :-)
Ok, alle tre klasser har metoderne "PlayPause, Stop, Next, Previous, volume og Fullscreen"?
Hvis ja, så laver du et interface.
public interface IRemote { void PlayPuse(Int32 Handle); osv.. }
Det fortæller at klasser som implementerer interfacet SKAL have de metoder der, ellers kan du ikke compile. Endvidere kan du så caste din klasse til IRemote, som vist i tidligere indlæg.
Husk, at hvis du bruger et interface, og caster dit object, til den type, kan du ikke kalde metoder og egenskaber som ikke er forskrevet i interfacet. Du kan selvfølgelig have private metoder som bliver kaldt fra de andre metoder af.
Og så ville jeg nok lave din dllimport private, da den jo ikke skal kunne kaldes direkte uden fra klassen.
Det vil altså sige, at hvis BSPlayer har en funktion som ikke understøttes i media player, så skal denne metode dog være tilstede i WMRemoteControl selvom den ikke kan bruges til noget?
btw er switch forøvrigt så meget langsommere eller mere resurce krævende at jeg bør bruge if/else i stedet? Bare et hurtigt spørgsmål, da jeg ved det kun anbefales at bruge switch når man har mange statemnts at løbe igennem... Jeg kan bare så godt lide switch og den måde den står på i koden :-D
Jeg får desværre ikke lige tid at lave det her færdigt i den her uge alligevel :(, men jeg nåede da så langt den aften, at jeg praktisk talt har skrevet det hele om :-)
Jeg takker mange gange for hjælpen, men han der fik mig på det spor der har givet mig retningen er nok --- hmortensen.
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.