Warsztat - Programowanie gier

Lipiec 30, 2010, 17:27:18 *
Witamy, Gość. Zaloguj się, lub zarejestruj proszę.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Warsztat, Regulamin forum, #warsztat, Wiki, FAQ, NoPaste, Mapa
 
   Strona główna   Pomoc Szukaj Zaloguj się Rejestracja  
Strony: [1]
  Drukuj  
Autor Wątek: Specjalizacja szablonu  (Przeczytany 362 razy)
Dab
Member2000
*******

wiadomości: 2999


wiadomości: 2963


Zobacz profil WWW
« : 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
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.");
       }
   }
Zapisane

Anton Chigurh
Full Member
***

wiadomości: 145



Zobacz profil
« Odpowiedz #1 : 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.
Zapisane

postęp niniejszgo paska postępu : [|||||--------------]
Dab
Member2000
*******

wiadomości: 2999


wiadomości: 2963


Zobacz profil WWW
« Odpowiedz #2 : 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++. ;)
Zapisane

Strony: [1]
  Drukuj  
 
Skocz do:  

Hosting: Polska Strefa - Ogłoszenia
Powered by SMF 1.1.7 | SMF © 2006, Simple Machines LLC