Использование 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 (строка) и typeof (String)? Будет ли вышеупомянутое со строкой и строкой?
Питер

3
Хорошо, написал несколько модульных тестов, и это работает. Он действительно обрабатывает строку и строку одинаково. Я ожидал этого, но просто хотел убедиться.
Питер

4
@peter Да, stringи Stringравны. stringэто псевдоним для String.
Aage

Метод IsAssignableFrom: msdn.microsoft.com/en-us/library/… будет работать в большем количестве случаев (вместо оператора равенства, например, для дженериков)
мартин

1
@bump Только что видел этот комментарий несколько лет назад, но я просто хочу добавить для ясности, что stringэто псевдоним System.String. Это может иметь значение, потому что для использования Stringвам нужно добавить using System;строку. Мои 2 цента;)
Себастьян

0

Я только что наткнулся на этот отличный пост. Если вы просто проверяете, относятся ли данные к строковому типу, возможно, мы можем пропустить цикл и использовать эту структуру (по моему скромному мнению)

public static bool IsStringType(object data)
    {
        return (data.GetType().GetProperties().Where(x => x.PropertyType == typeof(string)).FirstOrDefault() != null);
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.