প্রতিবিম্বের মাধ্যমে প্রকারভেদযুক্ত ধরণের বৈশিষ্ট্যগুলি সন্ধান করুন


84

আমি প্রতিবিম্বের মাধ্যমে কোনও সামগ্রীর বৈশিষ্ট্যগুলি পরীক্ষা করি এবং প্রতিটি সম্পত্তির ডেটা ধরণের প্রক্রিয়া চালিয়ে যাই। এখানে আমার (হ্রাস) উত্স:

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;
  }
}

আমার সমস্যাটি হ'ল, আমি নতুনভাবে ননযোগ্য বৈশিষ্ট্যগুলি পরিচালনা করতে চাই, তবে কীভাবে কোনও নলযোগ্য সম্পত্তিটি পাওয়া যায় তার আমার কোনও ধারণা নেই।


আমি এখানে ভাল উত্তর চেষ্টা চেষ্টা!
ইয়েজটক ওয়েইনবার্গ

উত্তর:


132

সম্ভাব্য সমাধান:

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

4
নুলাবলির জন্য সঠিক চেকটি এমএসডিএন-তেও উল্লেখ করা হয়েছে: এমএসডিএন.মিকোসফটওয়্যার /en-us/library/ms366789.aspx । সেখানে, প্রয়োজন হলে আপনি এই বিষয়ের উপর আরও কিছু সংস্থান পেতে পারেন।
অলিভার

78
এক লাইনে করা যায়! :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));
            }

    }

4
আমি Nullable.GetUnderlyingType(type)সমাধানটি পছন্দ করি কারণ এটি type.GetGenericArguments()[0]কমপক্ষে এই ক্ষেত্রে এর চেয়ে বেশি স্পষ্ট ।
অলিভার

6
আপনি IsGenericType এবং GetGenericTypeDefinition চেক করতে প্রয়োজন হবে না , Nullable.GetUnderlyingTypeইতিমধ্যে যে নেটিভ না। যখন টাইপটি হ'ল নমনীয় নয় তখন গিটউন্ডারলিংটাইপ নালাগুলি ফিরে আসছে << (উত্স: msdn.microsoft.com/en-US/library/… )
ইয়ভেস এম

15
foreach (var info in typeof(T).GetProperties())
{
  var type = info.PropertyType;
  var underlyingType = Nullable.GetUnderlyingType(type);
  var returnType = underlyingType ?? type;
}

1

ইয়ভেস এম দ্বারা নির্দেশিত হিসাবে এটি নীচের মত সহজ।

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

  foreach (var prop in properties)
  {
     var propType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
     var dataType = propType.Name;
  }

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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.