c# - इंटरफ़ेस उदाहरण के पीछे कंक्रीट प्रकार ढूँढना




interface types (4)

आप जो कर रहे हैं वह वास्तव में बेड डिज़ाइन है लेकिन आपको प्रतिबिंब का उपयोग करने की ज़रूरत नहीं है आप इसे इस तरह से देख सकते हैं

void PerformAction(object myObject)
{
    B objectType = myObject as B;   // Here is where I get typeof(IA)
    if ( objectType != null )
    {
        //use objectType.b
    }
    else
    {
       //Same with A 
    }
    // snip - other actions on objectType
}

एक लंबी कहानी को छोटा करने के लिए मेरे पास एक C # फ़ंक्शन है जो किसी दिए गए प्रकार पर एक कार्य करता है जिसे ऑब्जेक्ट उदाहरण के रूप में पारित किया जाता है। जब क्लास का उदाहरण दिया जाता है तो सभी ठीक काम करते हैं। हालांकि, जब ऑब्जेक्ट को एक इंटरफ़ेस के रूप में घोषित किया जाता है, तो मैं वास्तव में कंक्रीट क्लास को ढूंढना चाहता हूं और उस क्लास के प्रकार पर कार्रवाई करता हूं।

यहाँ सर्वव्यापी बुरा उदाहरण है (गलत संपत्ति आवरण आदि के साथ देदीप्यमान):

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 में कोड पसंद करता है और देखता हूं कि यह सिर्फ IA का उदाहरण नहीं है, लेकिन यह B का एक उदाहरण है और GetProperties () के माध्यम से संपत्ति "b" देखने के लिए है। अगर मैं उपयोग करता हूं। गेट टाइप () मुझे IA का प्रकार मिलता है - जो मैं चाहता हूं वह नहीं।

PerformAction अंतर्निहित ठोस प्रकार IA के उदाहरण को कैसे निर्धारित कर सकता है?

कुछ को एक सार वर्ग का उपयोग करने का सुझाव देने के लिए लुभाया जा सकता है लेकिन यह सिर्फ मेरे बुरे उदाहरण की सीमा है। चर को मूल रूप से एक इंटरफ़ेस उदाहरण के रूप में घोषित किया जाएगा।


आपके पास कभी भी इंटरफ़ेस के उदाहरण नहीं हो सकते। इसलिए यह निर्धारित करना कि आप एक अंतरफलक के साथ काम कर रहे हैं या एक ठोस प्रकार संभव नहीं है क्योंकि आप हमेशा एक ठोस प्रकार के साथ काम करेंगे। इसलिए मुझे यकीन नहीं है कि आप सवाल किसी भी समझ में आता है। वास्तव में आप क्या और क्यों करना चाह रहे हैं?


शायद आप ऑपरेटर की तलाश कर रहे हैं

void PerformAction(object myObject)
{
    if (myObject is B)
    {
        B myBObject = myObject as B;
        myBObject.b = 1;
    }

    if (myObject is C)
    {
        C myCObject = myObject as C;
        myCObject.c = 1;
    }

    // snip - other actions on objectType
}

Type objectType = myObject.GetType();

अपने उदाहरण के अनुसार, आपको अभी भी ठोस प्रकार देना चाहिए।





concrete