एक लंबी कहानी को कम करने के लिए मेरे पास एक सी # फ़ंक्शन है जो ऑब्जेक्ट इंस्टेंस के रूप में पास किए गए किसी दिए गए प्रकार पर कार्य करता है। सभी वर्ग ठीक होने पर ठीक काम करता है। हालांकि, जब ऑब्जेक्ट को इंटरफ़ेस के रूप में घोषित किया जाता है, तो मैं वास्तव में ठोस वर्ग को ढूंढना चाहता हूं और उस वर्ग प्रकार पर कार्रवाई करना चाहता हूं।एक इंटरफ़ेस उदाहरण के पीछे कंक्रीट प्रकार ढूँढना
public interface IA
{
int a { get; set; }
}
public class B : IA
{
public int a { get; set; }
public int b { get; set; }
}
public class C : IA
{
public int a { get; set; }
public int c { get; set; }
}
// snip
IA myBObject = new B();
PerformAction(myBObject);
IA myCObject = new C();
PerformAction(myCObject);
// snip
void PerformAction(object myObject)
{
Type objectType = myObject.GetType(); // Here is where I get typeof(IA)
if (objectType.IsInterface)
{
// I want to determine the actual Concrete Type, i.e. either B or C
// objectType = DetermineConcreteType(objectType);
}
// snip - other actions on objectType
}
मैं चाहूँगा के खिलाफ यह पैरामीटर हो PerformAction में कोड प्रतिबिंब का उपयोग करें और देखते हैं कि यह सिर्फ आइए का एक उदाहरण नहीं है करने के लिए:
यहाँ हर जगह का बुरा उदाहरण (गलत संपत्ति आवरण आदि के साथ चमकीला) है लेकिन यह बी का एक उदाहरण है और GetProperties() के माध्यम से संपत्ति "बी" देखने के लिए। अगर मैं .GetType() का उपयोग करता हूं तो मुझे आईए का प्रकार मिलता है - जो मैं चाहता हूं।
प्रदर्शन एक्शन आईए के उदाहरण के अंतर्निहित कंक्रीट प्रकार को कैसे निर्धारित कर सकता है?
कुछ लोग सार कक्षा का उपयोग करने का सुझाव देने के लिए प्रेरित हो सकते हैं लेकिन यह केवल मेरे बुरे उदाहरण की सीमा है। चर मूल रूप से एक इंटरफेस उदाहरण के रूप में घोषित किया जाएगा।
यह एक खराब डिज़ाइन की तरह लगता है। आपको विशेष विधि के बारे में अपनी विधि जानने के बजाय पॉलिमॉर्फिज्म का उपयोग करना चाहिए। यदि आप बाद में जोड़ते हैं तो क्या होता है? –
क्या यह एक इंटरफ़ेस के उद्देश्य को हराने नहीं करता है? आपको इस बात पर ध्यान नहीं देना चाहिए कि जब तक यह इंटरफेस लागू करता है तब तक ठोस प्रकार क्या होता है। –
जॉन और क्रिस को +1, न केवल यह खराब डिजाइन है, लेकिन सवाल कोई समझ नहीं आता है। –