كيف يمكنني العثور على جميع الحقول العامة لكائن ما في C#؟

StackOverflow https://stackoverflow.com/questions/237275

  •  04-07-2019
  •  | 
  •  

سؤال

أقوم بإنشاء طريقة لأخذ ArrayList (يُفترض أنها مليئة بالكائنات) ثم أدرج جميع الحقول (وقيمها) لكل كائن في ArrayList.

حاليا الكود الخاص بي هو كما يلي:

public static void ListArrayListMembers(ArrayList list)
    {
        foreach (Object obj in list)
        {
            Type type = obj.GetType();
            string field = type.GetFields().ToString();
            Console.WriteLine(field);

        }
    }

بالطبع، أفهم المشكلة المباشرة المتعلقة بهذا الرمز:إذا نجح الأمر، فسيتم طباعة حقل واحد فقط لكل كائن في ArrayList.سأصلح هذا لاحقًا - الآن أشعر بالفضول حول كيفية الحصول على كافة الحقول العامة المرتبطة بكائن ما.

هل كانت مفيدة؟

المحلول

foreach (Object obj in list) {
    Type type = obj.GetType();

    foreach (var f in type.GetFields().Where(f => f.IsPublic)) {
        Console.WriteLine(
            String.Format("Name: {0} Value: {1}", f.Name, f.GetValue(obj));
    }                           
}

ملحوظة أن هذا الرمز يتطلب .NET Framework 3.5 في العمل؛ -)

نصائح أخرى

ويمكنك الحصول على جميع وجوه أعلن الحقول مباشرة في الصف مع BindingFlags:

GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)

ووجميع الحقول الكائن بما ورثت مع:

GetFields(BindingFlags.Public | BindingFlags.Instance)
public static void ListArrayListMembers(ArrayList list)
{
    foreach (Object obj in list)
    {
        Type type = obj.GetType();
        Console.WriteLine("{0} -- ", type.Name);
        Console.WriteLine(" Properties: ");
        foreach (PropertyInfo prop in type.GetProperties())
        {
            Console.WriteLine("\t{0} {1} = {2}", prop.PropertyType.Name, 
                prop.Name, prop.GetValue(obj, null));
        }
        Console.WriteLine(" Fields: ");
        foreach (FieldInfo field in type.GetFields())
        {
            Console.WriteLine("\t{0} {1} = {2}", field.FieldType.Name, 
                field.Name, field.GetValue(obj));
        }
    }
}

أود أن أذكر أن البحث عن IsPublic في الحقول ليس ضروريًا مثل type.GetFields() كما هو محدد بواسطة MSDN تنص على:

قيمة الإرجاع - اكتب:System.Reflection.FieldInfo[]

مصفوفة من كائنات FieldInfo تمثل كافة المجالات العامة محددة للنوع الحالي.

وبطبيعة الحال، فإن سؤالا آخر هو "لماذا هل لديك حقول العامة؟" - خصائص كونها الأفضل. كاستخراج، لاحظ أن التفكير ليس الخيار الوحيد: من الممكن أيضا لنوع لفضح انها خصائص على الطاير-في وقت التشغيل (مثل كيف تكشف عن DataTable مصنف / DataView أعمدة من الخصائص)

.

لدعم هذا (مع دعم أيضا أشياء بسيطة)، يمكنك استخدام TypeDescriptor:

        foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
        {
            Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
        }

وهذا يسمح أيضا للعديد من الخيارات التمدد - على سبيل المثال، إلى حد كبير تسريع انعكاس (من دون تغيير أي رمز).

    static void ListArrayListMembers(ArrayList list)
    {
        foreach (object obj in list)
        {
            Type type = obj.GetType();
            foreach (FieldInfo field in type.GetFields(BindingFlags.Public))
            {
                Console.WriteLine(field.Name + " = " + field.GetValue(obj).ToString());
            }
        }
    }
scroll top