2017-04-06 117 views
5

我正在研究C#控制檯應用程序。我的目標是創建一個名爲GroupEntity的對象,最好是非泛型類型的對象。在非泛型類C中包裝泛型類#

此GroupEntity對象內部將是一個'AttributeFilter'對象的列表,其中包含通用類型的對象,其中包含Active Directory中的用戶對象上的屬性名稱以及這些用戶對象的可能值。我希望AttributeFilter對象採用通用類型的原因是因爲AD中用戶對象的某些屬性是字符串,有些是int32,有些是int64等。

這裏是我的類(我剪掉了構造函數等以節省空間)

public class AttributeFilter<T> : IEqualityComparer<AttributeFilter<T>> 
     { 
      private string _attributeName;  
      private T _attributeValue;   
      private List<T> _attributeValues { get; set; } 

      public AttributeFilter(string attributeName) 
      { 
       AttributeName = attributeName; 
       _attributeValues = new List<T>(); 
      } 

      public void AddValues(T attributeValue) 
      { 
       AttributeValue = attributeValue; 
       if (!_attributeValues.Contains(AttributeValue)) 
       { 
        _attributeValues.Add(AttributeValue); 
       } 
      } 

// Ive cut out the getter setter etc that is not relevant 
} 

這裏是GroupEntity類。注意我有一個

List<AttributeFilter<T>> 

字段。問題是我不知道T將是什麼,直到我運行的Program.cs

public class GroupEntity<T> 
{ 
    private string _groupName; 

    // because I want to a have a List<AttributeFilter<T>>, but I dont really want this here. because of program.cs when I initialise a new GroupEntity<> I have to tell it what type. I wont know. The type could be int32, string, long or whatever. 
    private List<AttributeFilter<T>> _filters; 

    public void AddFilters(AttributeFilter<T> attributeFilter) 
    { 
     if (!_filters.Contains(attributeFilter, attributeFilter)) 
     { 
      _filters.Add(attributeFilter); 
     } 
    } 

    public GroupEntity() 
    { 
     _filters = new List<AttributeFilter<T>>(); 
    } 

    public GroupEntity(string groupName) : this() 
    { 
     _groupName = groupName; 
    } 

}

現在我用Program.cs的初始化及測試...

class Program 
    { 
     static void Main(string[] args) 
     { 

      // Create AttributeFilter object for user attribute: EYAccountType 
      var at1 = new AttributeFilter<string>("EYAccountType"); 
      at1.AddValues("02");    
      at1.AddValues("03"); 
      at1.AddValues("04"); 
      at1.AddValues("05"); 


      // try adding anothr AtributeFilter with same name. 
      var at3 = new AttributeFilter<string>("EYAccountType1"); 
      at3.AddValues("06"); 
      at3.AddValues("07"); 



      // Create AttributeFilter object for user attribute: userAccountControl 
      var at2 = new AttributeFilter<int>("userAccountControl"); 
      at2.AddValues(512); 
      at2.AddValues(544); 
      at2.AddValues(546); 
      at2.AddValues(4096); 


      // Now create a GroupEntity object 
      var group1 = new GroupEntity<string>("My_First_AD_Group_Name"); 


      // Try adding the above two AttributeFilter objects we created to the GroupEntity object. 
      group1.AddFilters(at1); 
      group1.AddFilters(at3); 

      // This is the problem. I know why this is happening. because I initialised the var group1 = new GroupEntity<string>. So it wont accept at2 because at2 is taking in int. 
      //group1.AddFilters(at2); 

} 

那麼如何我可以在沒有通用參數的情況下編寫我的GroupEntity類,因此我可以在其中包含各種類型的AttributeFilter<T>。所以例如,我可以容納AttributeFilter<int>AttributeFilter<string>AttributeFilter<long>

我似乎無法弄清楚這個問題。

+2

創建'AttributeFilter'的非泛型'AttributeFilter'基類,並引用GroupEntity中的基類。 –

+0

你的系統中的GroupEntity對象的實際用例是什麼?可以有三個字段('List >','List >','List >')是一個解決方案嗎?否則,如果你在編譯時不知道類型參數,泛型很可能不是要走的路。 –

+0

這些只是三個例子。基本上我試圖爲AD用戶屬性中使用的任何數據類型創建AttributeFilter 。字符串,long和int32是常見的。但是我也看到了string [],byte [],DateTime等等。所以我將不得不創造所有這些。 – user5078178

回答

2

或多或少你不能。

與不同類型的實例化的通用類型的具有彼此沒有關係(即AttributeFilter<long>AttributeFilter<int>沒有得到任何共同的基類 - 它們可用作ExceptionHttpClient作爲目前存在的)。因此,沒有辦法通過強大的輸入將這些類型的實例放入單個集合中。

標準解決方案 - 爲您的AttributeFilter<T>類型使用非通用基類或接口。或者 - 將它們存儲爲object的集合,並丟失所有類型的安全性,或者可能收集dynamic,它們至少會給你機會調用方法(以反思爲代價)。

+0

謝謝Alixei Lenenkov和Michael Liu的建議。 – user5078178