2013-03-03 15 views
7

Hier ist der Konstruktor:Wie übergebe ich einen generischen Typparameter an eine Methode, die von einem Konstruktor aufgerufen wird?

public PartyRoleRelationship(PartyRole firstRole, PartyRole secondRole) 
     { 
      if (firstRole == secondRole) 
       throw new Exception("PartyRoleRelationship cannot relate a single role to itself."); 

      if (firstRole.OccupiedBy == null || secondRole.OccupiedBy == null) 
       throw new Exception("One or both of the PartyRole parameters is not occupied by a party."); 

      // Connect this relationship with the two roles. 
      _FirstRole = firstRole; 
      _SecondRole = secondRole; 


      T = _FirstRole.GetType().MakeGenericType(); 

      _SecondRole.ProvisionRelationship<T>(_FirstRole); // Connect second role to this relationship. 
     } 

In der letzten Zeile, wo es ProvisionRelationship auf _SecondRole nennt, es mir die Laufzeitfehler ist zu geben: Typen oder Namespace ‚T‘ konnte nicht gefunden werden ...

Wie kann ich T entweder (a) korrekt zuweisen oder (b) einen generischen Typ mit dem Konstruktor übergeben? Ich habe schon ein paar Posts durchgesehen, aber vielleicht etwas aus Mangel an Verständnis vermisst. Jedermanns Hilfe würde sehr geschätzt werden.

+0

Ich habe Ihren Titel bearbeitet. Bitte lesen Sie "[Sollten die Fragen" Tags "in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/)", wobei der Konsens "nein, sie sollten nicht" lautet. –

+0

Was soll .ProvisionRelationship (PartyRole-Rolle) erreichen? – Moop

Antwort

12

Ihre Klasse muss generisch sein. So muss PartyRoleRelationship wie folgt aussehen:

public class PartyRoleRelationship<T> 
{ 
    public PartyRoleRelationship(T arg, ...) 
    { 
    } 
} 

Lesen Sie mehr über generische Klassen hier:

http://msdn.microsoft.com/en-us/library/sz6zd40f(v=vs.80).aspx

http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx

Edit:

Sie könnten wahrscheinlich vereinfachen Sie ein Bit-Code und es so machen:

public class RoleRelationship<T> 
{ 
    public RoleRelationship(T firstRole, T secondRole) 
    { 
     if (firstRole.OccupiedBy == null || secondRole.OccupiedBy == null) 
      throw new Exception("One or both of the Role parameters is not occupied by a party."); 

     // Connect this relationship with the two roles. 
     _FirstRole = firstRole; 
     _SecondRole = secondRole; 

     _SecondRole.ProvisionRelationship<T>(_FirstRole); 
    } 
} 
+0

Ich denke, Sie müssen das generische T besser qualifizieren, sonst könnten Sie ein Double, String, Int, -Objekt in den Konstruktor übergeben und es würde nicht wie erwartet funktionieren. – Moop

+0

Ja, das wäre eine sehr gute Idee. Phil, bitte werfen Sie einen Blick auf Moops Antwort, die zeigt, wie man spezifiziert, was T tatsächlich ist. – Cheesebaron

+0

Gibt es eine Möglichkeit, T innerhalb des Konstruktors zu definieren, anstatt einen generischen Typparameter in den Konstruktor zu übergeben? Wie, ziehen Sie den Typ von _SecondRole und übergeben Sie das ProvisionRelationship Phil

0

Wenn Sie die Art von _FirstRole statisch wissen (? Ist es PartyRole), können Sie nur das verwenden:

_SecondRole.ProvisionRelationship<PartyRole>(_FirstRole); 
+0

ich nicht. PartyRole ist die Basisklasse, aber sie leitet abgeleitete Klassen von PartyRole weiter. – Phil

4

eine generische Klasse machen, wo der generische Typ T ein Typ der Basisklasse ist PartyRole :

public class PartyRoleRelationship<T> where T : PartyRole 
{ 
    T _FirstRole; 
    T _SecondRole; 

    public PartyRoleRelationship(T role1, T role2) { 
     _FirstRole = role1; 
     _SecondRole = role2; 
     role1.ProvisionRelationship(role2) 
    } 

    public ProvisionRelationship(T otherRole) { 
      // Do whatever you want here 
    } 

} 
Verwandte Themen