2017-11-15 1 views
-1

Wenn ein Benutzer eine Antwort auf eine Frage ändert, möchte ich, dass er den Grund aus einer Reihe von Gründen angibt und je nach gewähltem Grund Ich möchte eine bestimmte Unterklasse erstellen. Also ich möchte den Typ in der ChangeReason Klasse erstellen. Ich kann es so tun, überprüft, dass die Art richtig zur Laufzeit angegeben ist:Verwendung von Type als Parameter, aber Beschränkung auf eine Basisklasse zum Zeitpunkt der Kompilierung

public class ChangeReason 
{ 
    Type _TypeToCreate;  

    public void SetQuestionType(Type value) 
    { 
     if (!value.IsSubclassOf(typeof(BaseAnsweredQuestion))) 
      throw new InvalidOperationException("Invalid Type"); 

     _TypeToCreate = value; 
    } 
} 

Gibt es eine Möglichkeit, die Art zum Zeitpunkt der Kompilierung zu beschränken, vielleicht eine generische Methode? Ich möchte es so nennen:

var reason = new ChangeReason(); 
reason.SetQuestionType(typeof(AnsweredQuestion)); 
+0

Diese leicht durch googeln beantwortet wird "C# generischen Typen beschränken" ... Siehe die [MSDN article] (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters) –

+0

Enttäuscht vom Downvote, nachdem er eine Barriere getroffen hat, versucht in den Griff zu bekommen mit Generika habe ich ausgestreckt um Hilfe, und ich bin überrascht, dass jemand denkt, dass diese Frage als "unerhört schlampig, ohne Aufwand ausgegebene Post" beschrieben werden könnte. https://stackoverflow.com/help/privileges/vote-down – Colin

Antwort

3

Eine generische Methodendefinition hat einen Platzhalter für den Typ z. <T>. Dies ist der Typparameter oder das Argument. Es ist eine Möglichkeit, den Methodentyp sicher zu machen, und auf das Argument type kann innerhalb der Methode zugegriffen werden. Daher muss der Typ nicht als Methodenargument übergeben werden.

Generische Methoden können durch Hinzufügen einer Integritätsbedingung auf eine angegebene Basisklasse oder Derivate dieser Basisklasse beschränkt werden: where T : <base class name>.

Und wenn die Basisklasse abstrakt ist, verhindert das Hinzufügen der new() Einschränkung auch die Verwendung des Basistyps.

public void SetQuestionType<T>() where T: BaseAnsweredQuestion, new() 
{ 
    _TypeToCreate = typeof(T); 
} 

Und dann können Sie es mit nennen:

reason.SetQuestionType<AnsweredQuestion>(); 

statt:

reason.SetQuestionType(typeof(AnsweredQuestion)); 
Verwandte Themen