Avatar billede Spotgun Seniormester
14. oktober 2004 - 09:26 Der 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:

public void setErrorMessage(string err, string message) {
  this.err = message;
}

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... :)

Nogen gode idéer?
Avatar billede burningice Nybegynder
14. oktober 2004 - 10:00 #1
der skal du bruge reflection... noget i den her reting (er ikke testet).

public void setErrorMessage(string err, string message) {
  typeof(this).GetField(err).SetValue(this, message);
}
Avatar billede Syska Mester
14. oktober 2004 - 16:34 #2
lyter med
Avatar billede jepsen999 Nybegynder
15. oktober 2004 - 07:45 #3
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.
Avatar billede Spotgun Seniormester
15. oktober 2004 - 11:18 #4
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 :)

Smider i et svar, så vi kan få lukket?
Avatar billede jepsen999 Nybegynder
15. oktober 2004 - 17:41 #5
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!
Avatar billede arne_v Ekspert
17. oktober 2004 - 16:02 #6
Her er noget kode som viser alle 3 muligheder:

Error.cs
--------

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);
    }
}

Error3.txt
----------

Ok = OK
NotOk = Not OK

Error3.da-DK.txt
----------------

Ok = Virker
NotOk = Virker ikke

build.bat
---------

resgen Error3.txt
csc /res:Error3.resources /res:Error3.da-DK.resources Error.cs
resgen Error3.da-DK.txt
al /t:lib /culture:da-DK /embed:Error3.da-DK.resources /out:da-DK\Error.resources.dll

output
------

OK
Not OK
Virker
Virker ikke
OK
Not OK
Virker
Virker ikke
OK
Not OK
Virker
Virker ikke
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