Finden Sie den Typ der nullbaren Eigenschaften durch Reflexion


83

Ich untersuche die Eigenschaften eines Objekts durch Reflexion und verarbeite den Datentyp jeder Eigenschaft weiter. Hier ist meine (reduzierte) Quelle:

private void ExamineObject(object o)
{
  Type type = default(Type);
  Type propertyType = default(Type);
  PropertyInfo[] propertyInfo = null;

  type = o.GetType();

  propertyInfo = type.GetProperties(BindingFlags.GetProperty |
                                    BindingFlags.Public |
                                    BindingFlags.NonPublic |
                                    BindingFlags.Instance);
  // Loop over all properties
  for (int propertyInfoIndex = 0; propertyInfoIndex <= propertyInfo.Length - 1; propertyInfoIndex++)
  {
    propertyType = propertyInfo[propertyInfoIndex].PropertyType;
  }
}

Mein Problem ist, dass ich neu nullbare Eigenschaften verarbeiten muss, aber ich habe keine Ahnung, wie ich den Typ einer nullbaren Eigenschaft erhalten kann.


Ich finde eine gute Antwort hier einen Versuch wert !!
Yitzhak Weinberg

Antworten:


130

mögliche Lösung:

    propertyType = propertyInfo[propertyInfoIndex].PropertyType;
    if (propertyType.IsGenericType &&
        propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
    {
      propertyType = propertyType.GetGenericArguments()[0];
    }

2
Die korrekte Prüfung auf Nullables wird auch auf MSDN erwähnt: msdn.microsoft.com/en-us/library/ms366789.aspx . Dort finden Sie bei Bedarf weitere Ressourcen zum Thema.
Oliver

76
Kann in einer Zeile erfolgen! :propertyType = Nullable.GetUnderlyingType(propertyType) ?? propertyType
Yves M.

6
propertyType.IsGenericTypewird in der Tat vorher benötigt propertyType.GetGenericTypeDefinition(), sonst wird eine Ausnahme ausgelöst. +1
Mike de Klerk

37

Nullable.GetUnderlyingType(fi.FieldType) erledigt die Arbeit für Sie. Überprüfen Sie den folgenden Code, um das zu tun, was Sie wollen

System.Reflection.FieldInfo[] fieldsInfos = typeof(NullWeAre).GetFields();

        foreach (System.Reflection.FieldInfo fi in fieldsInfos)
        {
            if (fi.FieldType.IsGenericType
                && fi.FieldType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
            {
                // We are dealing with a generic type that is nullable
                Console.WriteLine("Name: {0}, Type: {1}", fi.Name, Nullable.GetUnderlyingType(fi.FieldType));
            }

    }

5
Ich mag die Nullable.GetUnderlyingType(type)Lösung, weil sie type.GetGenericArguments()[0]zumindest in diesem Fall expliziter ist als .
Oliver

5
Sie müssen IsGenericType und GetGenericTypeDefinition nicht überprüfen , Nullable.GetUnderlyingTypetun Sie dies bereits nativ. GetUnderlyingType gibt null zurück, wenn der Typ nicht nullable <> ist (Quelle: msdn.microsoft.com/en-US/library/… )
Yves M.

14
foreach (var info in typeof(T).GetProperties())
{
  var type = info.PropertyType;
  var underlyingType = Nullable.GetUnderlyingType(type);
  var returnType = underlyingType ?? type;
}

0

Ich verwende eine Schleife, um alle Klasseneigenschaften zu durchlaufen und den Eigenschaftstyp abzurufen. Ich benutze den folgenden Code:

public Dictionary<string, string> GetClassFields(TEntity obj)
{
    Dictionary<string, string> dctClassFields = new Dictionary<string, string>();

    foreach (PropertyInfo property in obj.GetType().GetProperties())
    {
        if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) && property.PropertyType.GetGenericArguments().Length > 0)
            dctClassFields.Add(property.Name, property.PropertyType.GetGenericArguments()[0].FullName);
        else
            dctClassFields.Add(property.Name, property.PropertyType.FullName);
    }

    return dctClassFields;
}

0

Diese Methode ist einfach, schnell und sicher

public static class PropertyInfoExtension {
    public static bool IsNullableProperty(this PropertyInfo propertyInfo)
        => propertyInfo.PropertyType.Name.IndexOf("Nullable`", StringComparison.Ordinal) > -1;
}

0

Wie von Yves M. hervorgehoben , ist es so einfach wie unten.

var properties = typeof(T).GetProperties();

  foreach (var prop in properties)
  {
     var propType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
     var dataType = propType.Name;
  }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.