使用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对象中找出它是什么类型。

我将不得不处理一些基本的东西,例如字符串,整数,双打。但是我也必须处理对象,如果是这样,我将需要遍历这些对象内部的对象树以验证其中的基本数据,它们还将具有字符串等。

谢谢。

Answers:


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都可以吗?
彼得2010年

3
好的,编写了一些单元测试并且可以正常工作。确实确实将string和String视为相同。我期望如此,但是只是想确定一下。
彼得2010年

4
@peter是的,string并且String相等。string是的别名String
Aage

IsAssignableFrom方法:msdn.microsoft.com/en-us/library/…将在更多情况下工作(而不是使用相等的运算符,例如泛型)
马丁

1
@bump几年前才看到此评论,但为了清楚起见,我只想补充一点,它string是的别名System.String。这可能会有所不同,因为要使用Stringusing System;行,您必须添加行。我的2分钱;)
塞巴斯蒂安·塞夫林

0

我只是偶然发现了这个很棒的帖子。如果您只是检查数据是否为字符串类型,那么也许我们可以跳过循环并使用此结构(以我的拙见)

public static bool IsStringType(object data)
    {
        return (data.GetType().GetProperties().Where(x => x.PropertyType == typeof(string)).FirstOrDefault() != null);
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.