2016-02-17 14 views
6

ले मैं निम्न विधिएक सामान्य विधि है कि एक सामान्य प्रकार

private void Foo<T, TItem>(T<TItem> param1) 

कहाँ टी एक सामान्य प्रकार है कि अपने सामान्य जानकारी के रूप में TItem लेता होना चाहिए लिखने के लिए चाहते हैं बनाने के लिए।

कॉल उदाहरण होगा जैसे:

private void Main() 
{ 
    List<int> ints = new List<int>(); 
    Foo<List, int>(ints);  
} 

संपादित करें: मेरे मामले में मैं केवल संग्रह के लिए की आवश्यकता होगी। वास्तविक उपयोग केस यह है कि मैं एक ऐसी विधि लिखना चाहता था जो आईसीओलेक्शन में कुछ जोड़ता है दुख की बात है कि ICollection में .Add विधि नहीं है, केवल ICollection<T> है। उस के साथ के बाद से मैं जानकारी क्या वास्तविक सूची है, जो सूची के भीतर आइटम टाइप की तुलना में मेरे लिए ज्यादा महत्वपूर्ण है टाइप खोने हूँ

private Foo<T>(ICollection<T>) 

:

मैं करने के लिए विधि नहीं बदल सकते।

इसलिए उपर्युक्त विचार पैदा हुआ, जो काम नहीं करता था।

+0

मुझे नहीं लगता कि कि 'List' हमेशा एक सामान्य पैरामीटर की उम्मीद को देखते हुए संभव है है। – MutantNinjaCodeMonkey

+1

मुझे नहीं लगता कि आप उस बाधा को बना सकते हैं। टी को एक सामान्य प्रकार होने के बारे में क्या है जो IInterface लागू करता है जहां टी TTtem से निकला है? –

+0

मुझे वास्तव में समझ में नहीं आता कि कैसे 'फू' को 'टी' और 'टीआईटीएम 'को वर्णित तरीके से संबंधित करने की आवश्यकता होगी; क्या आप एक और विशिष्ट उदाहरण दे सकते हैं? – Codor

उत्तर

7

के बाद से आप की जरूरत ही संग्रह के लिए, तो आप इस तरह एक विधि का वर्णन कर सकता है कि: इस मामले में

private void Foo<T, TItem>(T param1) 
    where T: ICollection<TItem> 
{ 
} 

हालांकि आप पहली बार सामान्य पैरामीटर के रूप में विशिष्ट सामान्य प्रकार (List<int>) प्रदान करने के लिए की जरूरत है, आप नहीं कर सकते बस List का उपयोग करें:

List<int> ints = new List<int>(); 
Foo<List<int>, int>(ints); 
+0

'' IENumerable ''?? –

+0

@EhsanSajjad के बाद से 'ICollection ' लागू करता है 'IENumerable ' आप एक या दूसरे का उपयोग कर सकते हैं, जो – dotnetom

+0

पर निर्भर करता है यह समाधान काम करता प्रतीत होता है, लेकिन यह थोड़ी सी बदबू आती है कि मुझे जेनेरिक प्रकार की जानकारी निर्दिष्ट करनी है, क्या शायद कुछ इसके चारों ओर रास्ता? –

0

मुझे लगता है जैसे आप एक मन के जाल में फंस गए हैं। जो कुछ भी आप करने की कोशिश कर रहे हैं उसे हल करने का शायद एक बेहतर तरीका है।

वैसे भी, Dictionary का उपयोग करने का प्रयास करें। आपको वास्तव में एक विधि लिखने की आवश्यकता नहीं है।

int number = 15; 
double dub = 15.5; 
Button button = new Button(); 

Dictionary<object, Type> typeGlossary = new Dictionary<object, Type>(); 
typeGlossary.Add(number, typeof(int)); 
typeGlossary.Add(dub, typeof(double)); 
typeGlossary.Add(button, typeof(Button)); 

अंततः, अपने आगे उग्र कोड इंजेक्शन मस्तिष्क अन-मजबूत करने के लिए सी # की प्रबलता से टाइप किये प्रणाली की कोशिश कर छोड़ देना होगा। हम सब कुछ इस समय करते हैं।

1

हो सकता है कि यह मदद कर सकते हैं:

एक आधार वर्ग और व्युत्पन्न वर्ग बनाएँ।

public class Item 
{ 

} 

public class Item<T> : Item 
{ 
    T Value; 

    public Item(T value) 
    { 
     Value = value; 
    } 
} 

फिर आप उपयोग कर सकते हैं आप कैसे हैं:

public class SomewhereElse 
{ 
    public void Main() 
    { 
     List<Item> itemCollection = new List<Item>(); 
     itemCollection.Add(new Item<int>(15)); 
     itemCollection.Add(new Item<string>("text")); 
     itemCollection.Add(new Item<Type>(typeof(Image))); 
     itemCollection.Add(new Item<Exception>(new StackOverflowException())); 
     itemCollection.Add(new Item<FormWindowState>(FormWindowState.Maximized)); 
     // You get the point.. 
    } 
} 
संबंधित मुद्दे