Використання 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, який він тип.

Мені доведеться мати справу з основними елементами, такими як рядки, ints, double. Але мені доведеться також мати справу і з об'єктами, і якщо так, мені знадобиться просунути дерево об’єктів далі всередині цих об’єктів, щоб перевірити основні дані всередині них, вони також матимуть рядки тощо.

Дякую.

Відповіді:


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)? Чи буде вищезгадане з і рядком, і String?
пітер

3
Гаразд, написав кілька одиничних тестів, і це працює частуванням. Це дійсно трактує рядок і String те саме. Я очікував цього, але просто хотів переконатися.
пітер

4
@peter Так, stringі Stringрівні. stringпсевдонім для String.
Aage

Метод IsAssignableFrom: msdn.microsoft.com/en-us/library/… працюватиме в більшості випадків (замість рівного оператора, наприклад, generics)
март

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.