प्रतिबिंब के माध्यम से अशक्त गुणों का पता लगाएं


83

मैं प्रतिबिंब के माध्यम से किसी वस्तु के गुणों की जांच करता हूं और प्रत्येक संपत्ति के डेटा प्रकार को संसाधित करता रहता हूं। यहाँ मेरा (कम) स्रोत है:

private void ExamineObject(object o)
{
  Type type = default(Type);
  Type propertyType = default(Type);
  PropertyInfo[] propertyInfo = null;

  type = o.GetType();

  propertyInfo = type.GetProperties(BindingFlags.GetProperty |
                                    BindingFlags.Public |
                                    BindingFlags.NonPublic |
                                    BindingFlags.Instance);
  // Loop over all properties
  for (int propertyInfoIndex = 0; propertyInfoIndex <= propertyInfo.Length - 1; propertyInfoIndex++)
  {
    propertyType = propertyInfo[propertyInfoIndex].PropertyType;
  }
}

मेरी समस्या यह है, कि मुझे अशक्त गुणों को संभालने की आवश्यकता है, लेकिन मेरे पास कोई सुराग नहीं है कि एक अशक्त संपत्ति का प्रकार कैसे प्राप्त किया जाए।


मैं कोशिश कर रहा लायक यहाँ अच्छा जवाब मिल !!
यित्ज़ाक वेनबर्ग

जवाबों:


130

संभावित समाधान:

    propertyType = propertyInfo[propertyInfoIndex].PropertyType;
    if (propertyType.IsGenericType &&
        propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
    {
      propertyType = propertyType.GetGenericArguments()[0];
    }

2
Nullables की सही जाँच MSDN: msdn.microsoft.com/en-us/library/ms366789.aspx पर भी की गई है । यदि आवश्यक हो, तो आप इस विषय पर कुछ और संसाधन पा सकते हैं।
ओलिवर

76
एक लाइन में किया जा सकता है! :propertyType = Nullable.GetUnderlyingType(propertyType) ?? propertyType
यवेस एम।

6
propertyType.IsGenericTypeवास्तव में पहले की आवश्यकता है propertyType.GetGenericTypeDefinition(), अन्यथा एक अपवाद फेंक दिया जाता है। +1
माइक डी क्लार्क

37

Nullable.GetUnderlyingType(fi.FieldType) आप जिस चीज को चाहते हैं, उसके लिए आप नीचे दिए गए कोड की जांच के लिए काम करेंगे

System.Reflection.FieldInfo[] fieldsInfos = typeof(NullWeAre).GetFields();

        foreach (System.Reflection.FieldInfo fi in fieldsInfos)
        {
            if (fi.FieldType.IsGenericType
                && fi.FieldType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
            {
                // We are dealing with a generic type that is nullable
                Console.WriteLine("Name: {0}, Type: {1}", fi.Name, Nullable.GetUnderlyingType(fi.FieldType));
            }

    }

5
मुझे Nullable.GetUnderlyingType(type)समाधान पसंद है क्योंकि यह type.GetGenericArguments()[0]कम से कम इस मामले में अधिक स्पष्ट है ।
ओलिवर

5
आपको IsGenericType और GetGenericTypeDefinition की जांच करने की आवश्यकता नहीं है , Nullable.GetUnderlyingTypeपहले से ही मूल रूप से ऐसा करते हैं। GetUnderlyingType जब अशक्त नहीं है, तो अशक्त लौट रहा है <(स्रोत: msdn.microsoft.com/en-US/library/… )
Yves M.


0

मैं संपत्ति प्रकार प्राप्त करने के लिए सभी वर्ग गुणों के माध्यम से जाने के लिए एक लूप का उपयोग कर रहा हूं। मैं निम्नलिखित कोड का उपयोग करता हूं:

public Dictionary<string, string> GetClassFields(TEntity obj)
{
    Dictionary<string, string> dctClassFields = new Dictionary<string, string>();

    foreach (PropertyInfo property in obj.GetType().GetProperties())
    {
        if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) && property.PropertyType.GetGenericArguments().Length > 0)
            dctClassFields.Add(property.Name, property.PropertyType.GetGenericArguments()[0].FullName);
        else
            dctClassFields.Add(property.Name, property.PropertyType.FullName);
    }

    return dctClassFields;
}

0

यह विधि आसान, तेज और सुरक्षित है

public static class PropertyInfoExtension {
    public static bool IsNullableProperty(this PropertyInfo propertyInfo)
        => propertyInfo.PropertyType.Name.IndexOf("Nullable`", StringComparison.Ordinal) > -1;
}

0

जैसा कि यवेस एम ने बताया है कि यह नीचे की तरह सरल है।

var properties = typeof(T).GetProperties();

  foreach (var prop in properties)
  {
     var propType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
     var dataType = propType.Name;
  }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.