2013-03-03 35 views
7

這裏是構造函數:如何將泛型類型參數傳遞給從構造函數調用的方法?

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. 
     } 

在最後一行,在那裏它_SecondRole呼籲ProvisionRelationship,它給我的運行時錯誤:類型或命名空間「T」找不到...

我該如何(a)正確地分配T,或(b)通過構造函數傳遞一個泛型類型?我一直在瀏覽不少帖子,但由於缺乏理解可能錯過了某些內容。任何人的幫助將不勝感激。

+0

我編輯了你的標題。請參見「[應的問題包括‘標籤’,在他們的頭銜?(http://meta.stackexchange.com/questions/19190/)」,這裏的共識是「不,他們不應該」。 – 2013-03-03 23:11:54

+0

什麼是.ProvisionRelationship(PartyRole角色)應該完成? – Moop 2013-03-03 23:12:06

回答

12

你的課程需要是通用的。所以PartyRoleRelationship需要看起來像這樣:

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

瞭解更多關於泛型類在這裏:

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

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

編輯:

你也許可以簡化您的代碼位並像這樣做:

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

我認爲您需要更好地限定泛型T,否則您可以將double,string,int,object傳遞給構造函數,並且不會按預期工作。 – Moop 2013-03-03 23:49:07

+0

是的,這將是一個非常好的主意。菲爾,請看看穆普的回答,它顯示瞭如何指定T實際是什麼。 – Cheesebaron 2013-03-03 23:52:23

+0

但是,有沒有辦法在構造函數中定義T,而不是將通用類型參數傳遞給構造函數?像,從_SecondRole拉類型並將其傳遞給ProvisionRelationship Phil 2013-03-04 00:02:46

0

如果你知道_FirstRole靜態類型(?是成員角色),你可以使用:

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

我不這樣做。 PartyRole是基類,但它傳遞派生類的PartyRole。 – Phil 2013-03-03 23:03:19

4

做一個泛型類在泛型類型T是一個類型的基類成員角色的:

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 
    } 

} 
相關問題