BindingFlags.IgnoreCase Type.GetProperty () के लिए काम नहीं कर रहा है?


183

निम्नलिखित की कल्पना करो

टाइप टी में एक फील्ड कंपनी है। निम्नलिखित विधि को निष्पादित करते समय यह पूरी तरह से काम करता है:

Type t = typeof(T);
t.GetProperty("Company")

निम्नलिखित कॉल के साथ मैं हालांकि शून्य मिलता है

Type t = typeof(T);
t.GetProperty("company", BindingFlags.IgnoreCase)

किसी को एक विचार मिला?


20
@OregonGhost: क्या यह मायने रखता है?
लीपी

9
जबकि आपका मेटा प्रश्न वैध है, यह वास्तव में वास्तव में मायने नहीं रखता है। मेरे अधिकांश सवालों के रूप में, मेरा प्राथमिक कारण ज्ञान की भूख है;)
बोरिस कॉल

1
@ इलेप्पी: हाँ, यह करता है। हो सकता है कि इसके लिए एक उपयोग-मामला हो, जिसकी मुझे जानकारी नहीं है, और यह हमेशा दिलचस्प होता है कि लोग चीजों को क्यों करना चाहते हैं।
ओरेगॉनहोस्ट

21
@OregonGhost: सभी भाषाएं लक्षित नहीं करती हैं। नेट केस संवेदनशील होते हैं, यही कारण है कि आपको कुछ समय के लिए असंवेदनशील दिखना चाहिए।
पॉप कैटलिन

2
मेरे लिए केस का उपयोग करें: इसलिए मैं इस बात की परवाह किए बिना MSSQL कॉम्पैक्ट इकाई के खिलाफ वस्तुओं की तुलना कर सकता हूं कि उन्होंने खेतों को कैसे टाइप किया। (मैं एक कॉम्पैक्ट डेटाबेस के खिलाफ एक ऑब्जेक्ट की तुलना कर रहा हूं, जहां कुछ फ़ील्ड नाम नाम की तुलना में और IsSomething है।) दूसरे शब्दों में, आलस्य के लिए।
तेयोन

जवाबों:


389

आपने डिफ़ॉल्ट लुक-अप झंडे को ओवरराइट कर दिया है, यदि आप नए झंडे निर्दिष्ट करते हैं तो आपको सभी जानकारी प्रदान करने की आवश्यकता होती है ताकि संपत्ति मिल सके। उदाहरण के लिए:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance


7
किसी को भी कोई भी विचार है कि यह इस तरह क्यों है (ज्ञान के लिए पूछ रहा है?)
श्रीवल्लभ

2
@ श्रीवल्लभ बंधन जब आप केवल संपत्ति के नाम की आपूर्ति करते हैं, तो बाइंडिंग फ़्लैग.इंस्टॉल डिफ़ॉल्ट झंडे होते हैं
ओटाबेक खोलिकोव

1
@ श्रीवल्लभ ने ओताबेखोलिकोव की व्याख्या में यह जोड़ते हुए कहा कि अगर इन डिफॉल्ट्स को रखा जाए और आपके लिए निर्दिष्ट (ओआर) BindingFlagsउन्हें डिफॉल्ट का उपयोग न करने का कोई तरीका नहीं होगा। यानी Publicसंपत्तियों को बाहर करना या संपत्तियों को बाहर करना संभव नहीं होगा Instance। उन्होंने तय किया कि आप या तो चूक कर सकते हैं, या उन्हें ठीक-ठीक निर्दिष्ट करके बता सकते हैं कि आप क्या कर रहे हैं।
xr280xr

36

आपको जोड़ने की आवश्यकता है BindingFlags.Public | BindingFlags.Instance


2
आपको वोट कम मिलते हैं, लेकिन आप 2 मिनट तेज थे - लेकिन फिर, पॉप के जवाब में अधिक विवरण थे। मैं उन सभी को वोट देता हूं जो इसके हकदार हैं! :)
टोनी बसालो

10

धन्यवाद, यह वास्तव में आज एक चुटकी में मेरी मदद करता है। मेरे पास ऑडिट जानकारी सहेजी गई थी, लेकिन संपत्ति के नामों पर गलत आवरण के साथ। (ऑडिटिंग को एक डेडलेयर में बनाया गया है।) वैसे भी मुझे एक बंधन ध्वज के रूप में इग्नोरकेस को जोड़ना था, लेकिन तब भी यह काम नहीं किया, जब तक कि मेरे सहकर्मी को यह जवाब नहीं मिला। परिणामी फ़ंक्शन:

public static void SetProperty(Object R, string propertyName, object value)
{
    Type type = R.GetType();
    object result;
    result = type.InvokeMember(
        propertyName, 
        BindingFlags.SetProperty | 
        BindingFlags.IgnoreCase | 
        BindingFlags.Public | 
        BindingFlags.Instance, 
        null, 
        R, 
        new object[] { value });
}

यह एक वर्ग का हिस्सा है जिसे मैं डॉटमैजिक कहता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.