Found a good article on the visitor pattern using C# / .Net
Visitor Design Pattern revisited for .Net
818925e8-5292-4048-ac26-493f43745b57|0|.0
|
Coding is art, photography too.
|
|
87f03e06-5005-448b-b156-b3eecd457638|0|.0
A simple yet efficient way of getting translation into .Net objects
Translatable name = newTranslatable();
Translatable splash = newTranslatable();
name[1033] = "Christmas";
name["nb-NO"] = "Jul";
splash["en-US"] = newForm();
splash[1044] = newForm();
string translatedname = name;
Form translatedform = splash;
All of this is possible with some use of generics and an implicit operator.
[Serializable]
public class Translatable
{
public T Default
{
get
{
bool hit = false;
if (TranslatedValues.Count == 1)
return TranslatedValues[0].TranslatedValue;
if (TranslatedValues.Count == 0)
{
if (!(typeof(T) == typeof(string)))
{
return default(T);
}
else
{
object o = string.Empty;
return (T)o;
}
}
System.Globalization.CultureInfo temp = System.Globalization.CultureInfo.CurrentUICulture;
T result = default(T);
while (temp != System.Globalization.CultureInfo.InvariantCulture)
{
Translated tres = TryGetTranslated(temp.Name);
if (tres != null)
{
result = tres.TranslatedValue;
hit = true;
break;
}
else
{
temp = temp.Parent;
}
}
if (!hit)
{
Translated tres = TryGetTranslated(string.Empty);
if (tres != null)
{
result = tres.TranslatedValue;
hit = true;
}
}
if (!hit && TranslatedValues.Count > 0)
result = TranslatedValues[0].TranslatedValue;
return result;
}
}
protected IList> m_TranslatedValues = new List>();
public virtual IList> TranslatedValues
{
get { return m_TranslatedValues; }
}
public T this[string languageCode]
{
get { return TryGetTranslatedValue(languageCode); }
set
{
Translated tr = TryGetTranslated(languageCode);
if (tr == null)
{
TranslatedValues.Add(new Translated(languageCode, value));
}
else
{
tr.TranslatedValue = value;
}
}
}
public T this[int LCID]
{
get { return this[new System.Globalization.CultureInfo(LCID).Name]; }
set { this[new System.Globalization.CultureInfo(LCID).Name] = value; }
}
protected Translated TryGetTranslated(string languageCode)
{
Translated result = null;
foreach (Translated tr in TranslatedValues)
{
if (tr.LanguageCode.Equals(languageCode))
{
result = tr;
break;
}
}
return result;
}
public T TryGetTranslatedValue(string languageCode)
{
Translated result = TryGetTranslated(languageCode);
if (result == null)
return default(T);
else
return result.TranslatedValue;
}
public static implicit operator T(Translatable val)
{
return val.Default;
}
public override string ToString()
{
if (Default != null)
return Default.ToString();
else
return base.ToString();
}
}
[Serializable]
public class Translated
{
protected Translated() { }
public Translated(string languageCode, T translatedValue)
{
m_LanguageCode = languageCode;
m_TranslatedValue = translatedValue;
}
protected T m_TranslatedValue = default(T);
public T TranslatedValue
{
get { return m_TranslatedValue; }
set { m_TranslatedValue = value; }
}
protected string m_LanguageCode = string.Empty;
public string LanguageCode
{
get { return m_LanguageCode; }
set { m_LanguageCode = value; }
}
}
3746808c-06a4-4d38-aa37-22058c9fe34e|1|5.0
My first post.
Is that good?
0de84e37-9718-4975-a519-844efa0fe4f8|0|.0