2012-07-13 22 views
5

Moja funkcja wymaga podania go jako napisu a Typ jako T. Na podstawie T chcę przeanalizować ciąg znaków val jako ten typ, ale otrzymuję błąd z tytułu to pytanie. Każdy, kto ma jakiś wgląd lub inne sposoby realizacji tej funkcji, byłbym bardzo wdzięczny.Ograniczenie nie może być specjalną klasą "System.Object"

T Parse<T>(string val) where T : System.Object 
    { 
     TypeCode code = Type.GetTypeCode(typeof(T)); 
     switch (code) 
     { 
      case TypeCode.Boolean: 
       return System.Boolean.Parse(val); 
       break; 
      case TypeCode.Int32: 
       return Int32.Parse(val); 
       break; 
      case TypeCode.Double: 
       return Double.Parse(val); 
       break; 
      case TypeCode.String: 
       return (string)val; 
       break; 
     } 
     return null; 
    } 
+3

Co jesteś robienie tam to nadużywanie leków generycznych. Jeśli zamierzasz sprawdzić typ, po co w ogóle używać generycznych? – Oded

+0

możliwy duplikat [C# Generics: Constraining T gdzie T: Object nie kompiluje; Błąd: ograniczenie nie może być obiektem klasy specjalnej] (http://stackoverflow.com/questions/10644703/c-sharp-generics-constraining-t-where-t-object-doesnt-compile-error-constr) – nawfal

Odpowiedz

15

Po prostu usuń where T : System.Object.

Stwierdzając:

where T : System.Object 

mówisz, że typy T nadające się metodę Parse musi dziedziczyć z obiektu.
Ale, ponieważ każdy obiekt w języku C# dziedziczy po System.Object, nie potrzebujesz tego ograniczenia (i prawdopodobnie jest to jeden z powodów, dla których kompilator na to nie pozwala).

Ponadto, skoro wracasz null należy ograniczenie typ T być rodzaj odniesienia, więc:

where T: class 

Ale w ten sposób nie można powrócić logiczną, Integer lub cokolwiek wartość rodzaj.

Jednak kod zasadniczo naśladuje funkcjonalność Convert.ChangeType, jedyną różnicą jest to, że używasz rodzajowych, aby przywrócić prawidłowy typ zamiast obiektu, ale jest w zasadzie równa:

T Parse<T>(string val) 
{ 
    return (T)Convert.ChangeType(val,typeof(T)); 
} 
+0

Wyszukiwane na coś innego, ale znalazłem odpowiedź, która rozwiązała mój problem. –

Powiązane problemy