मेरे पास एक तृतीय-पक्ष, बंद स्रोत एप्लिकेशन है जो एक COM इंटरफ़ेस निर्यात करता है, जिसका उपयोग मैं अपने सी # .NET अनुप्रयोग में इंटरऑप के माध्यम से कर रहा हूं। यह COM इंटरफ़ेस कई ऑब्जेक्ट्स निर्यात करता है जो सभी सिस्टम के रूप में दिखाई देते हैं। ऑब्जेक्ट जब तक कि मैं उन्हें उपयुक्त इंटरफ़ेस प्रकार पर नहीं डालता। मैं इन सभी वस्तुओं की एक संपत्ति असाइन करना चाहता हूं। इस प्रकार:"संपत्ति एक्स" बाधा के साथ जेनेरिक फ़ंक्शन?
foreach (object x in BigComInterface.Chickens)
{
(x as Chicken).attribute = value;
}
foreach (object x in BigComInterface.Ducks)
{
(x as Duck).attribute = value;
}
लेकिन संपत्ति बताए अपवाद है जहाँ से मैं ठीक करने के लिए चाहते हैं फेंक (आवेदन विशेष कारण है कि अपरिहार्य हैं के लिए) होने की संभावना है, इसलिए मैं वास्तव में हर एक के आसपास आज़माएं/कैच चाहते हैं। इस प्रकार:
foreach (object x in BigComInterface.Chickens)
{
SetAttribute<Chicken>(x as Chicken, value);
}
foreach (object x in BigComInterface.Ducks)
{
SetAttribute<Duck>(x as Duck, value);
}
void SetAttribute<T>(T x, System.Object value)
{
try
{
x.attribute = value;
}
catch
{
// handle...
}
}
समस्या देखें:
foreach (object x in BigComInterface.Chickens)
{
try
{
(x as Chicken).attribute = value;
}
catch (Exception ex)
{
// handle...
}
}
foreach (object x in BigComInterface.Ducks)
{
try
{
(x as Duck).attribute = value;
}
catch (Exception ex)
{
// handle...
}
}
जाहिर है, यह इतना यह करने के लिए क्लीनर हो सकता है? मेरा x मान किसी भी प्रकार का हो सकता है, इसलिए संकलक को संकलित नहीं कर सकता। संग्रहित करें। चिकन और बतख किसी भी प्रकार के विरासत पेड़ में नहीं हैं और वे पर एक इंटरफ़ेस साझा नहीं करते हैं।। अगर उन्होंने किया, तो मैं उस इंटरफ़ेस के लिए टी पर एक बाधा डाल सकता था। लेकिन चूंकि कक्षा बंद स्रोत है, यह मेरे लिए संभव नहीं है।
मेरी कल्पना में, मैं क्या चाहता हूं, कुछ ऐसी बाधाओं की तरह है जो पर तर्क की आवश्यकता होती है। इस सामग्री पर है, भले ही यह किसी दिए गए इंटरफ़ेस को लागू करता हो। बुद्धि के लिए,
void SetAttribute<T>(T x, System.Object value) where T:hasproperty(attribute)
मैं यहाँ से क्या करना है यकीन नहीं है अन्य कटौती करने के लिए की तुलना में/चिकन, बतख, गाय, भेड़ से प्रत्येक के लिए इस छोटे से आज़माएं/कैच ब्लॉक, और इतने पर पेस्ट करें।
मेरा प्रश्न है: किसी ऑब्जेक्ट पर एक विशिष्ट संपत्ति का आह्वान करने की इच्छा रखने के इस समस्या के लिए एक अच्छा कामकाज क्या है जब उस संपत्ति को लागू करने वाले इंटरफ़ेस को संकलित समय पर नहीं जाना जा सकता है?
धन्यवाद, रीड। मैंने प्रतिबिंब तकनीक का प्रयास किया - यह मुझे जो चाहिए वह करता है लेकिन धीमा है। – catfood
चूंकि कोई सामान्य इंटरफ़ेस नहीं है, इसलिए तेज़ vtable- आधारित जेनेरिक इनवॉक करने का कोई तरीका नहीं है - आपको नाम पर गतिशील लुकअप करना है, और यह हमेशा धीमा, प्रतिबिंब या नहीं होता है। –
@ पावेल: हाँ, यह हमेशा धीमा रहता है, लेकिन तकनीकी रूप से, यह एकमात्र तरीका है जो मौजूदा कक्षाओं को बदलने के बिना काम करता है, जब तक सी # 4 बाहर नहीं हो जाता। मैं यह नहीं कह रहा कि यह अच्छा है, बल्कि यह काम करेगा। –