Korzystanie z PropertyInfo, aby znaleźć typ właściwości


108

Chcę dynamicznie analizować drzewo obiektów, aby przeprowadzić niestandardową weryfikację. Walidacja nie jest ważna jako taka, ale chcę lepiej zrozumieć klasę PropertyInfo.

Będę robić coś takiego,

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;
}

Naprawdę jedyną rzeczą, na której mi zależy w tej chwili, jest „jeśli właściwość jest łańcuchem”. Jak mogę dowiedzieć się z obiektu PropertyInfo, jaki to jest typ.

Będę musiał poradzić sobie z podstawowymi rzeczami, takimi jak stringi, ints, double. Ale będę musiał również zajmować się obiektami, a jeśli tak, będę musiał przejść drzewo obiektów dalej w tych obiektach, aby zweryfikować podstawowe dane w nich zawarte, będą one również miały łańcuchy itp.

Dzięki.

Odpowiedzi:


215

Użyj, PropertyInfo.PropertyTypeaby uzyskać typ nieruchomości.

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
Wspaniały. Spróbuję tego. Czy typeof (string) i typeof (String) są równoważne? Czy powyższe będzie zawierało zarówno string, jak i String?
Piotr

3
OK, napisałem kilka testów jednostkowych i działa świetnie. Rzeczywiście traktuje string i String tak samo. Spodziewałem się tego, ale chciałem się upewnić.
Piotr

4
@peter Tak, stringi Stringsą równe. stringjest aliasem dla String.
Aage

Metoda IsAssignableFrom: msdn.microsoft.com/en-us/library/… będzie działać w większej liczbie przypadków (zamiast operatora równego, np. Generics)
martin

1
@bump Właśnie widziałem ten komentarz sprzed kilku lat, ale dla jasności chcę dodać, że stringjest to alias dla System.String. Może to mieć znaczenie, ponieważ aby użyć String, musisz dodać using System;linię. Moje 2 centy;)
Sébastien Sevrin

0

Właśnie natknąłem się na ten wspaniały post. Jeśli tylko sprawdzasz, czy dane są typu string, to może możemy pominąć pętlę i użyć tej struktury (moim skromnym zdaniem)

public static bool IsStringType(object data)
    {
        return (data.GetType().GetProperties().Where(x => x.PropertyType == typeof(string)).FirstOrDefault() != null);
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.