알 수없는 컬렉션에서 값을 반복하고 인쇄하는 일반적인 방법이 있습니까?

.net c# expression-trees generics lambda

문제

예를 들어, 다음과 같은 Print 메서드가 있다고 가정 해 봅시다.

private static void Print(IEnumerable items)
{
    // Print logic here
}

이 클래스는 Print 클래스에 전달하여 테이블과 같은 모든 필드를 인쇄해야합니다. 예를 들어, 내 입력 컬렉션은 "Persons"또는 "Orders"또는 "Cars"등일 수 있습니다.

Print 메서드에 "Cars"컬렉션을 전달하면 Make, Color, Price, Class 등의 "Car"세부 정보 목록이 인쇄됩니다.

런타임까지 컬렉션의 유형을 알 수 없습니다. 나는 TypeDescriptorsPropertyDescriptorCollection 사용하여 솔루션을 시도하고 달성했다. 그러나 나는 그것이 좋은 해결책이라고 생각하지 않습니다. 표현식이나 제네릭을 사용하여이를 달성 할 수있는 다른 방법이 있습니까?

수락 된 답변

다음과 같이 Print를 구현할 수 있습니다.

static void Print<T>(IEnumerable<T> items)
{
    var props = typeof(T).GetProperties();

    foreach (var prop in props)
    {
        Console.Write("{0}\t", prop.Name);
    }
    Console.WriteLine();

    foreach (var item in items)
    { 
        foreach (var prop in props)
        {
            Console.Write("{0}\t", prop.GetValue(item, null));
        }
        Console.WriteLine();
    }
}

단순히 클래스의 각 속성을 루프하여 속성 이름을 인쇄 한 다음 각 항목에 대해 인쇄하고 각 항목에 대해 속성 값을 인쇄합니다.

나는 여기에서 제네릭을 사용해야한다고 주장 할 것이다. (다른 대답의 제안과는 대조적으로); 테이블 헤더를 인쇄 할 수 있도록 컬렉션의 항목을 단일 유형으로 지정합니다.

표 서식을 지정하기 위해이 질문에 대한 답을 확인할 수 있습니다.


인기 답변

표시하려는 모든 정보를 포함하도록 개체의 ToString() 메서드를 재정의 한 다음 원하는 경우 언제든지 호출 할 수 있습니다. 표현이나 제네릭이 필요 없습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow