Autor Wątek: Specjalizacja szablonu  (Przeczytany 1185 razy)

Offline Dab

  • Redaktor
    • blog

# Wrzesień 09, 2009, 22:29:18
Czy ktoś mający doświadczenie z C# ma pomysł jak rozwiązać poniższy problem? W skrócie:
* GetValue<T> powinien zwrócić obiekt typu T utworzony ze stringa
* domyślny konwerter z bool nie rozumie wyrażeń 0/1
* GetParam<bool> niestety wywołuje GetValue<T> (a nie specjalizację)

Czy w ogóle da się w C# zrobić taką specjalizację jak w C++?
Można to niby załatwić za pomocą refleksji czy choćby if (typeof(T) == typeof(bool)), ale...

Kod: (csharp) [Zaznacz]
public static class Ext
    {
        public static T GetParam<T>(this XmlNode n, string name)
        {
            return GetParam<T>(n, name, default(T));
        }
        public static T GetParam<T>(this XmlNode n, string name, T def)
        {
            if (n["extra"] == null) return def;
            if (n["extra"]["technique"] == null) return def;

            foreach (XmlNode n2 in n["extra"]["technique"])
            {
                if (n2.Name == "param")
                {
                    if (n2.Attributes["name"].Value == name)
                    {
                        return GetValue<T>(n2.InnerText);
                    }
                }
            }

            return def;
        }
        public static T GetValue<T>(string s)
        {
            return (T)(s as IConvertible).ToType(typeof(T), CultureInfo.CurrentCulture);
        }
        public static bool GetValue(string s)
        {
            if (s.Trim() == "1" || s.Trim().ToLower() == "true") return true;
            if (s.Trim() == "0" || s.Trim().ToLower() == "false") return false;
            throw new Exception("Can't convert <" + s + "> to Boolean.");
        }
    }

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Anton Chigurh

  • Użytkownik

# Wrzesień 09, 2009, 22:54:26
pierwszy wynik z google:

http://stackoverflow.com/questions/600978/how-to-do-template-specialization-in-c

jest tam jakiś czar emulujący specjalizację - może wystarczyć.

Co więcej wynika stamtąd, że generyki (otóż to - nie szablony niestety) w C# są przetwarzane w runtime z czego wynika, że nawet gdyby było to możliwe w samym języku, to nie dałoby się uniknąć ukrytego użycia refelksji.

Offline Dab

  • Redaktor
    • blog

# Wrzesień 09, 2009, 22:59:20
Sprawdzałem ten kod. Niestety, to czarowanie przestaje działać kiedy dodam ogólną postać szablonu (void Bar<T>(this MyClass<T> cls)).

Pomyśleć, że kiedyś nie cierpiałem szablonów w C++. ;)