14. oktober 2004 - 09:26Der er
5 kommentarer og 1 løsning
Generel set-metode?
Jeg har lavet en service-klasse jeg har tænkt mig at bruge i et par forskellige projekter, og klassen indeholder en række foruddefinerede fejlbeskeder.
Jeg vil dog gerne have muligheden for at man kan give fejlbeskederne en ny tekst, sådan at man f.eks. kan lave fler-sprogede versioner af de programmer der benytter klassen, uden at skulle lave en klasse til hvert sprog.
Så jeg kom på en idé med at lave en metode i serviceklassen ala dette:
Meningen er her, at man fra den instantierende klasse kan kalde setErrorMessage med de fejlbeskeder man vil ændre. Hvis jeg i serviceklassen har en:
private string errSourceNotFound = "Error: Source file not found";
Som jeg vil ændre til en dansk tekst, så ville man bruge noget ala dette:
setErrorMessage(errSourceNotFound, "Fejl: Filen blev ikke fundet");
Det nemmeste var nok bare at lave mine fejlbeskeder som public strings, men nu har jeg fået denne idé i hovedet, og vil blot vide om det kan lade sig gøre... :)
Du kan også gøre det med nedarvning hvor en superklasse indeholder alle fejlbeskeder på engelsk og de nedarvede klasser hver repræsenterer et andet sprog at udskrive fejl med: public class ErrorDefault // engelsk { public string virtual Error1 { get{return "An error occured";}} public string virtual Error2 { get{return "Another error occured";}} }
public class Fejltekst:ErrorDefault{ public string override Error1 { get{return "Der er opstået en fejl";}} public string override Error2 { get{return "Der er opstået en ny fejl";}} }
Du skal herefter erklære et fejlobjekt som du bruger når fejlene skal udskrives: private ErrorDefault mitFejlObjekt;
1: mitFejlObjekt = new FejlTekst(); eller 2: mitFejlOBjekt = new ErrorDefault();
Når du skal udskrive en fejl vil "mitFejlObjekt.Error1" udskrive på hhv. dansk og engelsk alt efter om 1 eller 2 er anvendt.
Tak for forslagene. Jeg har rodet lidt rundt med Cyberfessors forslag, men kunne ikke få det til at virke som forventet.
Prøver lige jepsens forslag - det virker som en ok løsning. Jeg har dog selv overvejet om man evt. kunne lave en metode i service-klassen, der kunne loade f.eks. en XML- eller tekst-fil, der lagde nye beskeder ind i fejlmeddelelserne, men har ikke testet om det er noget der kan lade sig gøre. Hvis det virker, ville det jo være relativt nemt at bygge nogle forskellige sprog-filer, som kunne bruges igen og igen.
Som nævnt i spørgsmålet er det heller ikke noget der er vanvittigt vigtigt for mig. Har lavet det med public strings indtil videre, og det kan jeg godt nøjes med, men det er da noget jeg vil arbejde videre med - min nysgerrighed er ikke stillet endnu :)
Mht. til at arbejde med flere sprog er der noget indbygget i .NET ( i hvert fald til windowsapp.) der bruger flersprogede ressource-filer så sproget i applikationen skifter bare du skifter defaultsprog i windows, men det er ikke min stærke side... Held og lykke med den løsning du nu vælger!
using System; using System.Globalization; using System.Resources; using System.Reflection; using System.Threading;
/********** Method #1 **********/
public class Error1 { private string ok = "OK"; private string notOk = "Not OK"; public string Ok { get { return ok; } } public string NotOk { get { return notOk; } } public void Change(string name, string newval) { GetType().GetField(name, BindingFlags.Instance | BindingFlags.NonPublic).SetValue(this, newval); } }
/********** Method #2 **********/
public abstract class Error2Any { public abstract string Ok { get; } public abstract string NotOk { get; } }
public class Error2EN : Error2Any { public override string Ok { get { return "OK"; } } public override string NotOk { get { return "Not OK"; } } }
public class Error2DA : Error2Any { public override string Ok { get { return "Virker"; } } public override string NotOk { get { return "Virker ikke"; } } }
public class Error2 { private Error2Any language; public Error2() { language = new Error2EN(); } public Error2Any Language { set { language = value; } } public string Ok { get { return language.Ok; } } public string NotOk { get { return language.NotOk; } } }
/********** Method #3 **********/
public class Error3 { private ResourceManager rm; public Error3() { rm = new ResourceManager(GetType()); } public string Ok { get { return rm.GetString("Ok"); } } public string NotOk { get { return rm.GetString("NotOk"); } } }
/********** Test **********/
class MainClass { public static void Main(string[] args) { // test method #1 Error1 e1 = new Error1(); Console.WriteLine(e1.Ok); Console.WriteLine(e1.NotOk); e1.Change("ok", "Virker"); e1.Change("notOk", "Virker ikke"); Console.WriteLine(e1.Ok); Console.WriteLine(e1.NotOk); // test method #2 Error2 e2 = new Error2(); Console.WriteLine(e2.Ok); Console.WriteLine(e2.NotOk); e2.Language = new Error2DA(); Console.WriteLine(e2.Ok); Console.WriteLine(e2.NotOk); // test method #3 Error3 e3 = new Error3(); Console.WriteLine(e3.Ok); Console.WriteLine(e3.NotOk); Thread.CurrentThread.CurrentUICulture = new CultureInfo("da-DK"); Console.WriteLine(e3.Ok); Console.WriteLine(e3.NotOk); } }
OK Not OK Virker Virker ikke OK Not OK Virker Virker ikke OK Not OK Virker Virker ikke
Synes godt om
Ny brugerNybegynder
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.