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オブジェクトからそれがどのタイプであるかをどのように確認できますか

文字列、int、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)は同等ですか?上記は文字列と文字列の両方を使用しますか?
ピーター

3
わかりました、いくつかの単体テストを書いて、それは御馳走を働かせます。実際、文字列と文字列を同じに扱います。私はそれを期待していましたが、確認したかっただけです。
ピーター

4
はい@peter、stringString等しいです。stringのエイリアスですString
年齢は

IsAssignableFromメソッド:msdn.microsoft.com/en-us/library/…は、より多くの場合に機能します(ジェネリックなどの等価演算子の代わりに)
martin

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.