Menggunakan PropertyInfo untuk mengetahui tipe properti

108

Saya ingin mengurai pohon objek secara dinamis untuk melakukan validasi kustom. Validasi tidak penting seperti itu, tetapi saya ingin memahami kelas PropertyInfo dengan lebih baik.

Saya akan melakukan sesuatu seperti ini,

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

Sungguh satu-satunya bagian yang saya pedulikan saat ini adalah 'jika properti adalah string'. Bagaimana saya bisa mengetahui dari objek PropertyInfo jenis apa itu.

Saya harus berurusan dengan hal-hal dasar seperti string, int, double. Tetapi saya juga harus berurusan dengan objek, dan jika demikian saya perlu melintasi pohon objek lebih jauh di dalam objek tersebut untuk memvalidasi data dasar di dalamnya, mereka juga akan memiliki string, dll.

Terima kasih.

peter
sumber

Jawaban:

215

Gunakan PropertyInfo.PropertyTypeuntuk mendapatkan tipe properti.

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;
}
Igor Zevaka
sumber
1
Bagus. Saya akan mencoba ini. Apakah typeof (string) dan typeof (String) setara? Akankah di atas dengan baik string dan string?
peter
3
OK, tulis beberapa tes unit dan itu berhasil. Itu memang memperlakukan string dan String sama. Saya mengharapkan itu, tetapi hanya ingin memastikan.
peter
4
@peter Ya, stringdan Stringsama. stringadalah alias untuk String.
Aage
Metode IsAssignableFrom: msdn.microsoft.com/en-us/library/… akan bekerja di lebih banyak kasus (bukan operator yang sama, misalnya obat generik)
martin
1
@bump Baru saja melihat komentar ini dari beberapa tahun yang lalu tetapi saya hanya ingin menambahkan untuk kejelasan bahwa stringalias untuk System.String. Ini bisa membuat perbedaan karena untuk menggunakan StringAnda harus menambahkan using System;garis. 2 sen saya;)
Sébastien Sevrin
0

Saya baru saja menemukan posting yang bagus ini. Jika Anda hanya memeriksa apakah datanya berjenis string maka mungkin kita bisa melewati loop dan menggunakan struct ini (menurut pendapat saya)

public static bool IsStringType(object data)
    {
        return (data.GetType().GetProperties().Where(x => x.PropertyType == typeof(string)).FirstOrDefault() != null);
    }
A. Varma
sumber