Mülk türünü bulmak için PropertyInfo kullanma


108

Bazı özel doğrulama yapmak için bir nesne ağacını dinamik olarak ayrıştırmak istiyorum. Doğrulama bu kadar önemli değil, ancak PropertyInfo sınıfını daha iyi anlamak istiyorum.

Bunun gibi bir şey yapacağım

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

Gerçekten şu anda tek umursadığım kısım 'eğer özellik bir dizge ise'. Bir PropertyInfo nesnesinden ne tür olduğunu nasıl öğrenebilirim?

Teller, tamsayılar, çiftler gibi temel şeylerle uğraşmam gerekecek. Ama aynı zamanda nesnelerle de ilgilenmem gerekecek ve eğer öyleyse, içlerindeki temel verileri doğrulamak için nesne ağacını bu nesnelerin içinde daha ileriye götürmem gerekecek, ayrıca dizeleri de olacak.

Teşekkürler.

Yanıtlar:


215

PropertyInfo.PropertyTypeMülkün türünü öğrenmek için kullanın .

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
Harika. Bunu deneyeceğim. Typeof (string) ve typeof (String) eşdeğer midir? Yukarıdakiler hem dize hem de String ile olacak mı?
peter

3
Tamam, bazı birim testler yazdım ve bir muamele yapıyor. Gerçekten string ve String'i aynı şekilde ele alır. Bunu bekliyordum ama emin olmak istedim.
peter

4
@peter Evet stringve Stringeşittir. stringiçin bir takma addır String.
Aage

IsAssignableFrom yöntemi: msdn.microsoft.com/en-us/library/… daha fazla durumda çalışacak (eşit operatör yerine, örneğin jenerikler)
martin

1
@bump Bu yorumu birkaç yıl önce görmüştüm, ancak stringbunun bir takma adı olan netliği eklemek istiyorum System.String. Bu bir fark yaratabilir çünkü kullanmak Stringiçin using System;satırı eklemeniz gerekir . Benim 2
sentim

0

Az önce bu harika gönderiye rastladım. Verilerin dizge türünde olup olmadığını kontrol ediyorsanız, o zaman belki döngüyü atlayabilir ve bu yapıyı kullanabiliriz (benim düşünceme göre)

public static bool IsStringType(object data)
    {
        return (data.GetType().GetProperties().Where(x => x.PropertyType == typeof(string)).FirstOrDefault() != null);
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.