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


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.