ใช้ 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 คู่ผสม แต่ฉันจะต้องจัดการกับวัตถุด้วยเช่นกันและถ้าเป็นเช่นนั้นฉันจะต้องสำรวจโครงสร้างวัตถุให้ลึกลงไปภายในวัตถุเหล่านั้นเพื่อตรวจสอบความถูกต้องของข้อมูลพื้นฐานที่อยู่ภายในพวกเขาจะมีสตริงเป็นต้น

ขอบคุณ.

คำตอบ:


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) เทียบเท่ากันหรือไม่ ข้างต้นจะมีทั้งสตริงและสตริงหรือไม่?
เตอร์

3
ตกลงเขียนการทดสอบหน่วยบางอย่างและใช้งานได้ดี มันถือว่าสตริงและสตริงเหมือนกัน ฉันคาดไว้อย่างนั้น แต่แค่อยากให้แน่ใจ
เตอร์

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);
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.