2017-05-20 8 views
4

Ich versuche, einen T-Wert zurück zu geben.Generische Art Funktion (Eigenschaft)

public T this[int index] 
{ 
    get 
    { 
      if (typeof(T) == typeof(int)) 
       return (T) dynEx[index].Int; 
      else if (typeof(T) == typeof(string)) 
       return (T) dynEx[index].Str; 
    } 
} 

Dynex ist ein komplexes Objekt, das ein Objekt auf einem gewissen benutzerdefinierten Ausdruck basiert zurückgibt.

Der obige Code funktioniert offensichtlich nicht, weil er einen Fehler hat: "kann den Typ 'int' nicht in T" konvertieren und "den Typ 'string' nicht in T" konvertieren.

Wie kann ich dies ohne Leistungseinbußen erreichen?

Diese Eigenschaft wird mehr als tausend Mal pro Frame aufgerufen (es ist ein Spiel).

+1

Wie ist 'T' bezogen auf den umschließenden Typ? –

+0

Wenn Sie sich nur für 2 Typen interessieren, denke ich, dass eine Strategie, die Überladungen verwendet, sinnvoller wäre als Generika. – juharr

Antwort

3

Um nach int zu casten, müssen Sie das Ergebnis zunächst auf object umwandeln, möglicherweise Boxen. Es ist ärgerlich, aber leider ist es eine Einschränkung von C# Generika - aus guten Gründen, die mir jetzt leider entgehen. So wollen Sie:

public T this[int index] 
{ 
    get 
    { 
     if (typeof(T) == typeof(int)) 
     { 
      return (T) (object) dynEx[index].Int; 
     } 
     else if (typeof(T) == typeof(string)) 
     { 
      return (T) (object) dynEx[index].Str; 
     } 
     // TODO: Whatever you want to happen if T isn't int/string 
    } 
} 
+1

Vielleicht, weil 'T' ein Wert oder ein Referenztyp sein kann, also zur Kompilierzeit eine potenziell gefährliche Besetzung wäre? Es ist meine Spekulation. –

+0

@ MatíasFidemraizer: Ich denke, es ist teilweise in der Richtung, ob es benutzerdefinierte Conversions geben kann, aber ich werde nicht zu viel spekulieren, ohne zu überprüfen :) –

+4

Um ehrlich zu sein, ist es nicht "leider" eine Beschränkung der C# Generika Leider ist es eine Einschränkung, dass jemand einen zu generischen, nicht-generischen Typ schreibt. Es ist im Grunde ein Missbrauch der ganzen Idee von Generika und ich bin mir nicht sicher, warum die C# -Compiler-Jungs so einfach schreiben sollten. –

Verwandte Themen