The visitor pattern in C#

by Bjarte Skogøy 27. February 2008 22:56

Found a good article on the visitor pattern using C# / .Net

Visitor Design Pattern revisited for .Net

Tags: , , ,

Coding is art

by Bjarte Skogøy 23. February 2008 08:29

Coding is art, photography too.

imgp1797

Tags:

Photography

Found in translation

by Bjarte Skogøy 23. February 2008 05:01

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

Tags: ,

First post

by bjarte.skogøy 21. February 2008 06:43

My first post.

Is that good?

Tags: