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.

user705274
quelle
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];
    }
Markus
quelle
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));
            }

    }
Pranay Rana
quelle
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;
}
Minh Giang
quelle
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;
}
Entwickler
quelle
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;
}
Murat ÖNER
quelle
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;
  }
Amir
quelle