संपत्ति प्रकार का पता लगाने के लिए PropertyInfo का उपयोग करना


108

मैं कुछ कस्टम सत्यापन करने के लिए ऑब्जेक्ट ट्री को गतिशील रूप से पार्स करना चाहता हूं। सत्यापन इस तरह महत्वपूर्ण नहीं है, लेकिन मैं संपत्तिइंफो वर्ग को बेहतर ढंग से समझना चाहता हूं।

मैं कुछ ऐसा करूंगा,

public bool ValidateData(object data)
{
    foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
    {
        if (the property is a string)
        {
            string value = propertyInfo.GetValue(data, null);

            if value is not OK
            {
                return false;
            }
        }
    }            

    return true;
}

इस समय मैं केवल इस बात की परवाह करता हूं कि only यदि संपत्ति एक स्ट्रिंग है ’। प्रॉपर्टीइंफो ऑब्जेक्ट से मैं कैसे पता लगा सकता हूं कि यह किस प्रकार का है।

मुझे स्ट्रिंग्स, इनट्स, डबल्स जैसे बुनियादी सामान से निपटना होगा। लेकिन मुझे वस्तुओं के साथ भी व्यवहार करना होगा, और अगर ऐसा है तो मुझे उन वस्तुओं के अंदर और नीचे के पेड़ को उनके अंदर के मूल डेटा को मान्य करने के लिए आगे बढ़ाना होगा, उनके पास तार आदि भी होंगे।

धन्यवाद।

जवाबों:


215

PropertyInfo.PropertyTypeसंपत्ति का प्रकार प्राप्त करने के लिए उपयोग करें ।

public bool ValidateData(object data)
{
    foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
    {
        if (propertyInfo.PropertyType == typeof(string))
        {
            string value = propertyInfo.GetValue(data, null);

            if value is not OK
            {
                return false;
            }
        }
    }            

    return true;
}

1
महान। मैं यह कोशिश करूंगा। टाइपोफ़ (स्ट्रिंग) और टाइपोफ़ (स्ट्रिंग) बराबर है? एक स्ट्रिंग और स्ट्रिंग दोनों के साथ ऊपर होगा?
पीटर

3
ठीक है, कुछ यूनिट परीक्षण लिखे और यह एक इलाज का काम करता है। यह वास्तव में स्ट्रिंग और स्ट्रिंग का इलाज करता है। मुझे उम्मीद थी कि, लेकिन सिर्फ यह सुनिश्चित करना चाहता था।
पीटर

4
@ वेटर हाँ, stringऔर Stringबराबर हैं। stringके लिए एक उपनाम है String
आवेश

IsAssignableFrom विधि: msdn.microsoft.com/en-us/library/… अधिक मामलों (समान ऑपरेटर के बजाय, उदाहरण के लिए जेनरिक) में काम करेगी
मार्टिन

1
@bump ने कुछ साल पहले ही इस टिप्पणी को देखा था, लेकिन मैं केवल स्पष्टता के लिए जोड़ना चाहता हूं जो इसके stringलिए एक उपनाम है System.String। यह एक अंतर बना सकता है क्योंकि उपयोग करने के लिए Stringआपको using System;लाइन जोड़ना होगा । मेरे 2 सेंट;)
सेबेस्टियन सेव्रिन

0

मैं बस इस महान पद पर ठोकर खाई। यदि आप केवल यह जांच रहे हैं कि डेटा स्ट्रिंग प्रकार का है या नहीं, तो हम लूप को छोड़ सकते हैं और इस संरचना का उपयोग कर सकते हैं (मेरी विनम्र राय में)

public static bool IsStringType(object data)
    {
        return (data.GetType().GetProperties().Where(x => x.PropertyType == typeof(string)).FirstOrDefault() != null);
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.