Verwenden von PropertyInfo, um den Eigenschaftstyp herauszufinden

108

Ich möchte einen Objektbaum dynamisch analysieren, um eine benutzerdefinierte Validierung durchzuführen. Die Validierung ist als solche nicht wichtig, aber ich möchte die PropertyInfo-Klasse besser verstehen.

Ich werde so etwas tun,

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

Wirklich der einzige Teil, der mich im Moment interessiert, ist "wenn die Eigenschaft eine Zeichenfolge ist". Wie kann ich aus einem PropertyInfo-Objekt herausfinden, um welchen Typ es sich handelt?

Ich werde mich mit grundlegenden Dingen wie Strings, Ints, Doubles beschäftigen müssen. Aber ich muss mich auch mit Objekten befassen, und wenn ja, muss ich den Objektbaum weiter unten in diesen Objekten durchlaufen, um die darin enthaltenen Basisdaten zu validieren. Sie haben auch Zeichenfolgen usw.

Vielen Dank.

Peter
quelle

Antworten:

215

Verwenden Sie PropertyInfo.PropertyTypediese Option , um den Typ der Eigenschaft abzurufen.

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
quelle
1
Toll. Ich werde es versuchen. Ist typeof (string) und typeof (string) gleichwertig? Wird das obige mit sowohl einem String als auch einem String?
Peter
3
OK, habe einige Unit-Tests geschrieben und es funktioniert ein Vergnügen. String und String werden in der Tat gleich behandelt. Ich habe das erwartet, wollte aber nur sicher gehen.
Peter
4
@ Peter Ja stringund Stringsind gleich. stringist ein Alias ​​für String.
Aage
Die IsAssignableFrom-Methode: msdn.microsoft.com/en-us/library/… funktioniert in mehreren Fällen (anstelle des gleichen Operators, z. B. Generika)
Martin
1
@bump Habe gerade diesen Kommentar von vor ein paar Jahren gesehen, aber ich möchte nur der Klarheit halber hinzufügen, dass dies stringein Alias ​​für ist System.String. Dies kann einen Unterschied machen, da Sie zur Verwendung Stringdie using System;Zeile hinzufügen müssen . Meine 2 Cent;)
Sébastien Sevrin
0

Ich bin gerade auf diesen tollen Beitrag gestoßen. Wenn Sie nur prüfen, ob die Daten vom Typ String sind, können wir möglicherweise die Schleife überspringen und diese Struktur verwenden (meiner bescheidenen Meinung nach).

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