문제

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 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 객체의 배열 공공 분야 현재 유형에 대해 정의되었습니다.

물론 또 다른 질문은 "왜 공공 분야를 얻었습니까?"입니다. - 특성이 바람직합니다. 추상화로서 반사는 유일한 옵션이 아닙니다. 유형이 런타임에 온라인으로 속성을 노출시키는 것도 가능합니다 (Untyped 방법 : 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());
            }
        }
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top