ERLEDIGT
NEIN
NEIN
ANTWORTEN
8
8
ZUGRIFFE
492
492
EMPFEHLEN
-
Hallo Leute,
vielleicht weis einer von Euch weiter.
Problemstellung auf ein denkbar einfachstes heruntergeschraubt.
Aufruf einer Methode mit folgender Syntax:
Code :1 2 3
int xAlter = 29; int xName = "Andralin"; trans("Hallo {xName}, Du bist {xAlter} Jahre", xName, xAlter)
und so die Methode mal grob geschildert
Code :1 2 3 4 5 6 7 8 9 10 11
public void trans(string x, params Object[] myParams) { // so finde ich den übergebenen Typ string VarArt1 = myParams[0].GetType().Name; // also quasi 'String' string VarArt2 = myParams[1].GetType().Name; //oder hier 'Int32' }
So finde ich zwar den übergebenen Typen, aber ich brauch den Namen der Varibalen/des Members der übergeben wurde.
Also für myParams[1] muss ich quasi xAlter bekommen
und für myParams[0] dann xName!
Wer weis wie ich daran komme.
LG Andralin
Hie rnoch einmal ein komplettes Beispiel-Projekt:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace myProj { class Program { static void Main(string[] args) { string xName = "Andralin"; string xOrt = "zu Hause"; //statt dem hier: Console.WriteLine(translate("Hallo {0}, Du bist jetzt {1}", xName, xOrt)); // möchte ich so aufrufen //Console.WriteLine(translate("Hallo {xName}, Du bist jetzt {xOrt}", xName, xOrt)); Console.WriteLine("Drück mal ne Taste"); Console.ReadKey(); } public static string translate(string x, params Object[] myParams) { // für die 2. Art auf zu rufen, benötige ich aber den namen der übergebenen Variablen // also tmp = myParams[nr].Name / oder so was string tmpStr = x; int pos = tmpStr.IndexOf("{", 0); string xxx = myParams[0].GetType().Name; while (tmpStr.IndexOf("{") > -1) { int p1 = tmpStr.IndexOf("{"); int p2 = tmpStr.IndexOf("}"); string tmpX = tmpStr.Substring(p1, p2 - p1 + 1); tmpX = tmpX.Substring(1, tmpX.Length - 2); int tmp = Convert.ToInt32(tmpX); tmpStr = tmpStr.Substring(0, p1) + myParams[tmp] + tmpStr.Substring(p2 + 1); } return tmpStr; } } }Geändert von andralin (05.09.08 um 17:08 Uhr) Grund: noch mal ein komplettes Projekt hinzugefügt....
-
Hi
Versteh ich das richtig? Du willst die beiden Werte in den String einfügen?
Dann:
Code csharp:1 2 3 4
string xName = "Andralin"; string xOrt = "zu Hause"; string text = String.Format("Hallo {0}, Du bist jetzt {1}", xName, xOrt); Console.WriteLine(text);
Grüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
05.09.08 20:18 #3
- Registriert seit
- Jun 2004
- Ort
- Wels (Oberösterreich) bzw. Mayrhofen (Tirol)
- Beiträge
- 211
Oder noch kürzer:Code :1 2 3 4
string xName = "Andralin"; string xOrt = "zu Hause"; string text = String.Format("Hallo {0}, Du bist jetzt {1}", xName, xOrt); Console.WriteLine(text);
Code :1 2 3
int xAlter = 29; string xName = "Adralin"; Console.WriteLine("Hallo {0}, du bist {1} Jahre alt!", xName, xAlter);
-
Ich möchte ähnlich einen String übergeben, in dem ich die Parameter schon als Platzhalter festlegen kann, aber nicht als %1, %2, etc sondern mit dem Object-Namen.
Beispiel:
string x; string y
so wäre das normalerweise
test("ausgabe {%1}, irgendwas {%2}", x, y)
so möchte ich das:
test("ausgabe {x}, irgendwas {y}", x, y)
es geht um eine Übersetzungsmöglichkeit wo ich parametrisierte Ausgaben übersetzen kann.
Die Methode wird nachher den komplette String inklusiver der Parameter-Positionen, aus einer Datenbank suchen und das anderssprachige Gegenstück raussuchen, dann die Parameter an der anderssprachigen Übersetzung setzen.
Zur besseren Wartbarkeit möchte ich aber anstatt der Platzhalter %1, %2, etc die Variablen-namen einsetzen, das man schon im String erkennt was für eine Art wert Textstellen enthalten werden, ... so kann auch wer das ganze warten, der nicht weis was für variablen eingesetzt werden. denn in der datenbank stehen nur die strings OHNE DIE VARS
also suche ich was das so funktioniert:
string tmpStr = "test"
Object test = tmpStr;
test.Name gibt es leider nicht, das sollte dann tmpStr ausgeben weil das der Name der Variable ist die in Object test geladen wurde.
Beispiel Deutsch:
alter = 20, name = andralin
"Hallo {name}, Du bist {%alter} Jahre alt", alter, name
Ausgabe:Hallo Andralin, Du bist 20 Jahre alt
oder englisch:
alter = 20, name = andralin
"Hi, your age is {alter} years, {name}", alter, name
Ausgabe: "Hi, your age is 20 years, Dirk", alter, name
Dabei möchte ich dynamisch bleiben, so das in der Datenbank folgendes steht
Deutsch: "Hallo {name}, Du bist {%alter} Jahre alt"
Englisch: "Hi, your age is {alter} years, {name}"
So brauche ich nur den String zu suchen, mit {} tags und lasse mir die Übersetzung ebenfalls mit den {} tags übergeben, kann die Tags auch mit [] machen oder mit anderen Zeichen,... Muss diese dann nur escapen wenn die im Text normal genutzt werden müssen.
Beispiel: "Hallo {name}, Du bist \{Sie sind\} {%alter} Jahre alt"
so würde er nur die { nutzen die ohne \ in der DB stehen.
Ich komme aber nicht weiter, weil ich den übergebenen Objectnamen nicht analysieren kann.
also translate(string text, params[])
nun muss ich nur den namen des jeweiligen über params[] übergebenen Parameters bekommen.
Beispiel:
translate("Hallo {name}, Du bist {%alter} Jahre alt", alter, name);
methode:
void translate(string text, params[])
{
string name = params[1].;
nun sollte ich irgendwie herausbekommen das daer Name für
params[0] = alter und für
params[1] = name ist.
dann kann ich im string die ausgabe dynamisch platzieren.
}Geändert von andralin (08.09.08 um 11:32 Uhr)
-
-
08.09.08 12:47 #6
- Registriert seit
- Aug 2001
- Ort
- Österreich, Stmk, Graz
- Beiträge
- 2.783
Hi.
Du könntest es über ein Dictionary lösen.. z.b. so:
Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
using System.Collections.Generic; public static string translate(string x, Dictionary<string, object> param) { foreach (string key in param.Keys) { x = x.Replace( string.Format("{{0}}", x), param[key] ); } } Dictionary<string, object> param = new Dictionary<string, object>(); param.Add("alter", 29); param.Add("name", "Adranlin"); string muh = translate("Hallo {xName}, Du bist {xAlter} Jahre", param);
With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
Aaron Satie
Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
Captain Jean-Luc Picard, Stardate ~41294.5
Tutorials.de chattet. Hier gibts auch .net Support ^^
Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de
(moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions
-
Wow, schon mal ein erster sinnvoller Ansatz, den ich mal ins Auge fasse, ...
Aber noch umständlich, da ich hier jede Variable im Dic definieren muss. Also waartungsunfreundlich bei größeren Projekten. Ein String oder Integer haben imer einem Member Namen, den muss man doch auslesen können wenn man die als object gecastet hat, immerhin weis das system dann doch auch immer noch was es eigentlich ist.
Aber schon mal ein guter Ansatz, der vielleicht besser ist als in den Tabellen der Datenbank nachher noch jedesmal Kommentare pflegen zu müssen welche variablen das sind.
Hier mal ein Beispielprojekt wie ich das momentan löse. Die Sprachakten noch hardgecoded und mit wenig sinnvollen Texten.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
using System; namespace myProj { class Program { static string[] germanCode = new string[0]; static string[] englishCode = new string[0]; static string[] spanischCode = new string[0]; static string[] currentCode; static string[] standardCode; static void Main(string[] args) { setLanguageTables(); standardCode = germanCode; currentCode = spanischCode; string xName = "Andralin"; int xAge = 25; // an dieser Stelle möchte ich aber mit Namen statt mit den Indexen arbeiten trPrint("Mein Name ist {0} und ich bin {1} Jahre alt", xName, xAge); trPrint("und hier ein Text ohne Parameter"); Console.WriteLine("Drück mal ne Taste"); Console.ReadKey(); } static void setLanguageTables() { addToTable(ref germanCode, "Mein Name ist {0} und ich bin {1} Jahre alt"); addToTable(ref englishCode, "My Name is {0} and I am {1} years old"); addToTable(ref spanischCode, "me llamo {0}, y soy {1} años"); addToTable(ref germanCode, "und hier ein Text ohne Parameter"); addToTable(ref englishCode, "and here a flat string without any options"); addToTable(ref spanischCode, "aqui, una translatión que hay no parametres"); addToTable(ref germanCode, "dritter"); addToTable(ref englishCode, "third"); addToTable(ref spanischCode, "tercero"); addToTable(ref germanCode, "vierter"); addToTable(ref englishCode, "fourth"); addToTable(ref spanischCode, "cuarto"); addToTable(ref germanCode, "letzter"); addToTable(ref englishCode, "last one"); addToTable(ref spanischCode, "por Último"); } static void trPrint(string dText, params Object[] dParams) { string tmpStr = translate(dText, currentCode); while (tmpStr.IndexOf("{") > -1) { int p1 = tmpStr.IndexOf("{"); int p2 = tmpStr.IndexOf("}"); string tmpX = tmpStr.Substring(p1, p2 - p1 + 1); tmpX = tmpX.Substring(1, tmpX.Length - 2); int tmp = Convert.ToInt32(tmpX); tmpStr = tmpStr.Substring(0, p1) + dParams[tmp] + tmpStr.Substring(p2 + 1); } Console.WriteLine(tmpStr); } static string translate(string d_text, string[] d_table) { string RetVal = null; int i = 0; foreach (string s in standardCode) { if (s == d_text) return d_table[i]; i++; } throw new Exception("translation ERROR on " + d_text); //return d_text + "(translation ERROR)"; } private static void trace(string p) { throw new NotImplementedException(); } static void addToTable(ref string[] d_table, string d_text) { int fld_ctr = d_table.Length + 1; string[] tmp = new string[fld_ctr]; if (fld_ctr == 1) tmp[0] = d_text; else { fld_ctr = 0; foreach (string text in d_table) { tmp[fld_ctr] = d_table[fld_ctr]; fld_ctr++; } tmp[fld_ctr] = d_text; } d_table = tmp; } } }
LG Andralin!
-
08.09.08 17:48 #8
- Registriert seit
- Jun 2004
- Ort
- Wels (Oberösterreich) bzw. Mayrhofen (Tirol)
- Beiträge
- 211
Das wirst du ohne Liste oder ähnliches nicht hinbekommen.
Du willst der Methode immerhin den Namen der lokalen Variable übergeben, und dabei scheinst du was vergessen zu haben/nicht zu wissen: lokale Variablen haben eigentlich gar keinen Namen! Klar, sie haben für dich in C#/VB/whatever einen Namen, aber direkt in Intermediate Language gibt es eigentlich gar nicht sowas wie "lokale Variablen".
Sie sind unter .NET in einem speziellen Array, dem local variables array, abgespeichert. Gleiches trifft auf Paramter zu.
Hier gilt es natürlich wieder in Werte- und Referenztypen zu unterteilen, aber lassen wir das. Fakt ist, lokale Variablen haben keinen Namen!
-
Ähnliche Themen
-
JUnit: The method assertEquals(Object, Object) is ambiguous
Von DarthShader im Forum JavaAntworten: 4Letzter Beitrag: 24.10.10, 10:37 -
Wert aus mySQL-Tabelle auslesen und je nach Wert vorher definierten Text ausgeben
Von RaffivK im Forum Relationale DatenbanksystemeAntworten: 3Letzter Beitrag: 03.10.08, 15:52 -
Wert aus XML auslesen?
Von multimolti im Forum PHPAntworten: 0Letzter Beitrag: 25.07.08, 09:09 -
Speichern mit Object Serialization --> beim Auslesen wird nicht alles ausgelesen
Von Nesaja im Forum Algorithmen & Datenstrukturen mit JavaAntworten: 2Letzter Beitrag: 21.11.07, 19:46 -
wert zwischen "wert" auslesen
Von ultrakollega im Forum PHPAntworten: 5Letzter Beitrag: 16.09.03, 11:39





Zitieren



Login





