Reflection के साथ टाइपकास्टिंग करके मैं अपनी वस्तु को उसके प्रकार में कैसे बदल सकता हूं? मैंने इस मुद्दे को इंटरनेट पर खोजा है, मुझे कुछ तरीके मिले हैं लेकिन वे मेरी समस्या के लिए उपयुक्त नहीं हैं। यह मेरा कोड है और मुझे अपनी कक्षा में फ़ील्ड डालने की ज़रूरत है जो कि किसी अन्य वर्ग गतिशील का प्रकार है।

यदि आप निम्न कोड देखते हैं, तो आप पाएंगे कि मैंने प्रत्येक फ़ील्ड कास्टिंग के लिए चार if जोड़े हैं। मैं कोड कम लाइनों के इस समूह को दोबारा करने का एक तरीका ढूंढ रहा हूं।

    public void CheckObjectFormatValues(object o)
    {
        FieldInfo[] fields = o.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
        foreach (System.Reflection.FieldInfo prp in fields)
        {

            if (prp.FieldType.BaseType != typeof(ValueType))
            {
                if (prp.FieldType.FullName == "IServiceProvider.Datacontracts.ArrivalType")
                    CheckObjectFormatValues((ArrivalType)prp.GetValue(o));

                if (prp.FieldType.FullName == "IServiceProvider.Datacontracts.Cell")
                    CheckObjectFormatValues((Cell)prp.GetValue(o));

                if (prp.FieldType.FullName == "IServiceProvider.Datacontracts.ObjectType")
                    CheckObjectFormatValues((ObjectType)prp.GetValue(o));

                if (prp.FieldType.FullName == "IServiceProvider.Datacontracts.ObjAction")
                    CheckObjectFormatValues((ObjAction)prp.GetValue(o));
            }
            else
            {
                var value = prp.GetValue(o).ToString();
                if (value == "-1")
                    throw new Exception("Error");
            }
        }
    }

क्या मेरे If ब्लॉक को पुनरावर्ती फ़ंक्शन के साथ पुन: सक्रिय करने और गतिशील रूप से कास्ट करने का कोई तरीका है?

0
Sasan K 16 सितंबर 2019, 12:12

1 उत्तर

सबसे बढ़िया उत्तर

कास्ट करने की कोई आवश्यकता नहीं है, आपकी विधि object को इसके पैरामीटर के रूप में लेती है

public void CheckObjectFormatValues(object o)
{
    FieldInfo[] fields = o.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
    foreach (System.Reflection.FieldInfo prp in fields)
    {

        if (prp.FieldType.BaseType != typeof(ValueType))
        {
            if(ShouldRecurse(prp.FieldType))
                 CheckObjectFormatValues(prp.GetValue(o));               
        }
        else
        {
            var value = prp.GetValue(o).ToString();
            if (value == "-1")
                throw new Exception("Error");
        }
    }
}

private bool ShouldRecurse(Type fieldType)
{
    // TODO
}

जैसा कि आप देख सकते हैं, आपको केवल यह निर्धारित करने के लिए कुछ तर्क की आवश्यकता है कि क्या, Type (FieldType) को देखते हुए, विधि को खुद को याद करना चाहिए। आप कक्षा, या साझा इंटरफ़ेस, या किसी भी अन्य तरीकों से एक विशेषता का उपयोग करके ऐसा कर सकते हैं।

व्यक्तिगत रूप से, मैं एक विशेषता के साथ जाऊंगा:

public class RequiresCheckObjectFormatValuesAttribute: Attribute 
{}

[RequiresCheckObjectFormatValues]
public class ArrivalType{ ... }

[RequiresCheckObjectFormatValues]
public class Cell{ ... }

और फिर आपकी ShouldRecurse विधि सरल है:

public bool ShouldRecurse(Type fieldType)
{
    return fieldType.GetCustomAttributes<RequiresCheckObjectFormatValuesAttribute>().Length>0;
}
1
Jamiec 16 सितंबर 2019, 10:13