c# .net reflection nullable

c# - Encuentre el tipo de propiedades que aceptan nulos a través de la reflexión



.net reflection (5)

Examino las propiedades de un objeto mediante reflexión y sigo procesando el tipo de datos de cada propiedad. Aquí está mi fuente (reducida):

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

Mi problema es que necesito manejar las propiedades que aceptan nulos, pero no tengo idea de cómo obtener el tipo de propiedad que admite valores NULL.


Este método es fácil, rápido y seguro

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


Estoy usando un bucle para recorrer todas las propiedades de clase para obtener el tipo de propiedad. Yo uso el siguiente código:

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


solución posible:

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


Nullable.GetUnderlyingType(fi.FieldType) hará el trabajo para que usted verifique el código a continuación para hacer lo que quiera

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


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