2017-04-06 7 views
5

मैं एक सी # कंसोल आवेदन पर काम कर रहा हूँ एक सामान्य वर्ग रैपिंग। मेरा उद्देश्य ग्रुपएन्टीटी नामक ऑब्जेक्ट बनाना है, अधिमानतः गैर सामान्य प्रकार का।अंदर एक गैर सामान्य वर्ग सी #

इस समूह एंटीटी ऑब्जेक्ट के अंदर 'विशेषता फ़िल्टर' ऑब्जेक्ट की एक सूची होगी जिसमें जेनेरिक प्रकार का ऑब्जेक्ट होता है जिसमें सक्रिय निर्देशिका में उपयोगकर्ता ऑब्जेक्ट पर विशेषता का नाम और उन उपयोगकर्ता ऑब्जेक्ट्स के संभावित मान होते हैं। कारण मैं एक सामान्य प्रकार लेने के लिए AttributeFilter ऑब्जेक्ट चाहता हूं क्योंकि एडी में उपयोगकर्ता ऑब्जेक्ट्स पर कुछ विशेषता स्ट्रिंग हैं, कुछ 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 
} 

यहां समूहइन्टिटी क्लास है। नोटिस मेरे पास

List<AttributeFilter<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); 

} 

तो कैसे क्या मैं अपनी ग्रुपएन्टिटी क्लास को जेनेरिक पैरामीटर के बिना लिख ​​सकता हूं ताकि मैं इसके अंदर विभिन्न प्रकार के AttributeFilter<T> रख सकूं। तो उदाहरण के लिए, मैं AttributeFilter<int> और AttributeFilter<string> और AttributeFilter<long>

मुझे इस समस्या को समझने में प्रतीत नहीं होता है।

+2

की 'AttributeFilter ' एक गैर सामान्य 'AttributeFilter' आधार वर्ग बनाएँ, और GroupEntity में आधार वर्ग के संदर्भ हैं। –

+0

आपके सिस्टम में 'GroupEntity' ऑब्जेक्ट के लिए वास्तविक उपयोग-केस क्या होगा? तीन क्षेत्रों ('सूची >', 'सूची >', 'सूची >') एक समाधान हो होने सकते हैं? अन्यथा, यदि आप संकलन समय पर प्रकार पैरामीटर नहीं जानते हैं, तो जेनेरिक शायद जाने का रास्ता नहीं है। –

+0

वे केवल तीन उदाहरण हैं। मूल रूप से मैं एडी उपयोगकर्ता विशेषताओं में उपयोग किए जाने वाले किसी भी डेटा प्रकार के लिए एक विशेषता फ़िल्टर बनाने का प्रयास कर रहा हूं। स्ट्रिंग, लम्बा और int32 आम हैं। लेकिन मैं स्ट्रिंग [], बाइट [], डेटटाइम और कुछ और भी देखता हूं। तो मुझे उन सभी को बनाना होगा। – user5078178

उत्तर

2

कमोबेश आप नहीं कर सकते।

जेनेरिक विभिन्न प्रकार के साथ instantiated प्रकार एक दूसरे से कोई संबंध नहीं है (अर्थात AttributeFilter<long> और AttributeFilter<int> किसी भी आम आधार वर्ग नहीं मिलता है - वे Exception और HttpClient के रूप में के रूप में differnet हैं)। इसलिए मजबूत टाइपिंग के साथ इस तरह के प्रकारों को एकल संग्रह में रखने का कोई तरीका नहीं है।

स्टैंडर्ड समाधान - अपने AttributeFilter<T> प्रकार के लिए का उपयोग गैर सामान्य आधार वर्ग या इंटरफ़ेस। वैकल्पिक रूप से - object के संग्रह के रूप में उन्हें स्टोर और सभी प्रकार के सुरक्षा, या हो सकता है संग्रह dynamic जो कम से कम तरीकों कॉल करने के लिए (प्रतिबिंब की कीमत पर) आप का मौका दे खो देते हैं।

+0

आपके सुझावों के लिए आपको Alixei Lenenkov और माइकल लियू धन्यवाद। – user5078178

संबंधित मुद्दे