PropertyInfo를 사용하여 속성 유형 찾기


108

사용자 지정 유효성 검사를 수행하기 위해 개체 트리를 동적으로 구문 분석하고 싶습니다. 유효성 검사는 그렇게 중요하지 않지만 PropertyInfo 클래스를 더 잘 이해하고 싶습니다.

이런 식으로 할 것입니다.

public bool ValidateData(object data)
{
    foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
    {
        if (the property is a string)
        {
            string value = propertyInfo.GetValue(data, null);

            if value is not OK
            {
                return false;
            }
        }
    }            

    return true;
}

현재 내가 신경 쓰는 유일한 부분은 '속성이 문자열 인 경우'입니다. PropertyInfo 객체에서 유형이 무엇인지 어떻게 알 수 있습니까?

나는 문자열, 정수, 복식과 같은 기본적인 것들을 다루어야 할 것입니다. 그러나 나는 또한 객체를 다루어야 할 것이고, 그렇다면 객체 내부의 기본 데이터를 검증하기 위해 객체 트리를 더 아래로 탐색해야 할 경우 문자열 등도 가질 것입니다.

감사.

답변:


215

PropertyInfo.PropertyType속성의 유형을 가져 오는 데 사용 합니다.

public bool ValidateData(object data)
{
    foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
    {
        if (propertyInfo.PropertyType == typeof(string))
        {
            string value = propertyInfo.GetValue(data, null);

            if value is not OK
            {
                return false;
            }
        }
    }            

    return true;
}

1
큰. 나는 이것을 시도 할 것이다. typeof (string) 및 typeof (String)는 동일합니까? 위의 내용이 문자열과 문자열 모두와 함께 사용됩니까?
피터

3
좋아, 몇 가지 단위 테스트를 작성했으며 치료가 가능합니다. 실제로 문자열과 문자열을 동일하게 취급합니다. 나는 그것을 예상했지만 확인하고 싶었습니다.
피터

4
예 @ 피터, stringString동일하다. string의 별칭입니다 String.
Aage

IsAssignableFrom 메서드 : msdn.microsoft.com/en-us/library/… 더 많은 경우에서 작동합니다 (예 : 제네릭 같은 연산자 대신)
martin

1
@bump 방금 몇 년 전에이 댓글을 보았지만 .NET string의 별칭 인 명확성을 위해 추가하고 싶습니다 System.String. 사용 String하려면 using System;선 을 추가해야 하므로 차이 가있을 수 있습니다 . 내 2 센트)
세바스티앙 Sevrin

0

나는 방금이 훌륭한 게시물을 우연히 발견했습니다. 데이터가 문자열 유형인지 확인하는 경우 루프를 건너 뛰고이 구조체를 사용할 수 있습니다 (내 겸손한 의견으로는)

public static bool IsStringType(object data)
    {
        return (data.GetType().GetProperties().Where(x => x.PropertyType == typeof(string)).FirstOrDefault() != null);
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.