जेनिक्स .NET 2.0 में जोड़े गए थे और COM .NET 1.0 से पहले मौजूद था।
(और प्रौद्योगिकी नेट उद्देश्य से को बदलने के लिए किया गया था।)
कॉम जेनरिक नहीं था, और इसलिए आप उन्हें का खुलासा नहीं कर सकते हैं।
COM भाषाओं में से कोई भी नहीं (सी ++, वीबी 6, डेल्फी) जेनेरिक था ताकि आप उन्हें उपभोग करने की उम्मीद न कर सकें।
(ठीक है, सी ++ था टेम्पलेट्स लेकिन वे पूरी तरह से एक अलग जानवर हैं, और COM केवल इंटरफेस। मतलब)
संग्रह उजागर के रूप में एक ArrayList
इस समस्या का solution, आप इसे चारों ओर काम नहीं कर सकता है।
अस्वीकरण: मैं तो जवाब के बाकी मोटे तौर पर मेरा अनुमान पर आधारित है कॉम पर कोई विशेषज्ञ हूँ।
कॉम कभी नहीं था "" ArrayList
है, सच है, लेकिन अभी यह कभी नहीं किसी भी .NET फ्रेमवर्क में कक्षाओं के था, क्योंकि यह एक ढांचे में ही नहीं है। हालांकि, कुछ .NET प्रकार निर्यात प्रकार पुस्तकालयों में आते हैं, और कुछ नहीं करते हैं। .NET फ्रेमवर्क कक्षाओं के बारे में क्या? खैर, ArrayList
[ComVisible]
है, और List<T>
नहीं है।
क्यों?
COM works via interfaces, और इंटरफेस परिभाषा भाषा में जेनेरिक के बारे में कोई जानकारी नहीं है और उनका समर्थन नहीं करता है। COM का समर्थन करने वाली भाषाएं, जैसे वीबी 6 या सी ++, जेनिक्स के साथ क्या करना है, यह नहीं पता।
अगर वहाँ एक तरह से List<T>
के लिए एक इंटरफेस उत्पन्न करने के लिए था, यह नहीं उस में T
शामिल तो वहाँ अनिवार्य रूप से एक सामान्य प्रकार का पर्दाफाश करने की कोशिश में कोई मतलब नहीं है जाएगा। इसके लिए संभावित काल्पनिक विकल्प होंगे:
- सामान्य प्रकार के लिए इंटरफ़ेस का "विशिष्ट" संस्करण उत्पन्न करना, उदा।
IListOfString
List<string>
- जेनेरिक प्रकार की जानकारी (जैसे जावा संकलन पर करता है) को मिटाकर को
object
के साथ बदलना।
पहला विकल्प व्यवहार्य क्योंकि ठोस T
प्रकार संकलन पर ज्ञात नहीं हो सकता नहीं है (पढ़ें: प्रतिबिंब), और List<T>
उस पर एक [ComVisible]
विशेषता वैसे भी जरूरत नहीं है।
दूसरा विकल्प वास्तव में एक तरह से संभव है क्योंकि आप कर सकते हैं provide your own class interface with IList
and ICollection
properties है:
[ComVisible(true)]
public interface IPerson
{
string Name { get;set;}
DateTime Entered { get;set;}
IList NickNamesList { get;}
ICollection NickNamesCollection { get;}
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComDefaultInterface(typeof(IPerson))]
public class Person:IPerson
{
[ComVisible(false)]
public List<string> NickNames
{
get { return _NickNames; }
set { _NickNames = value; }
}
private List<string> _NickNames = new List<string>();
#region IPerson Members
IList IPerson.NickNamesList
{
get { return this.NickNames; }
}
ICollection IPerson.NickNamesCollection
{
get { return this.NickNames; }
}
#endregion
....
}
यह एक समाधान नहीं है और हालांकि आपके प्रश्न का उत्तर नहीं देता है।
मैं वास्तव में सोच रहा हूं कि क्या आप StringList
कक्षा List<string>
से प्राप्त कर सकते हैं और इसे [ComVisible(true)]
के रूप में चिह्नित कर सकते हैं। आप इसे देखना चाह सकते हैं।
क्योंकि COM जेनरिक का समर्थन नहीं करता है। [इस] पर एक नजर डालें (http://stackoverflow.com/questions/1862497/c-exposing-class-to-com-generic-collections) और [इस] (http://stackoverflow.com/questions/ 269581/क्या-विकल्प-से-जेनेरिक-संग्रह-के-कॉम-इंटरऑप) प्रश्न। –