Badam właściwości obiektu poprzez odbicie i kontynuuję przetwarzanie typu danych każdej właściwości. Oto moje (zredukowane) źródło:
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;
}
}
Mój problem polega na tym, że na nowo muszę obsłużyć właściwości dopuszczające wartość null, ale nie mam pojęcia, jak uzyskać typ właściwości dopuszczającej wartość null.
c#
.net
reflection
nullable
user705274
źródło
źródło
Odpowiedzi:
możliwe rozwiązanie:
propertyType = propertyInfo[propertyInfoIndex].PropertyType; if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) { propertyType = propertyType.GetGenericArguments()[0]; }
źródło
propertyType = Nullable.GetUnderlyingType(propertyType) ?? propertyType
propertyType.IsGenericType
jest rzeczywiście wymagana wcześniejpropertyType.GetGenericTypeDefinition()
, w przeciwnym razie zostanie zgłoszony wyjątek. +1Nullable.GetUnderlyingType(fi.FieldType)
wykona pracę za Ciebie, sprawdź poniższy kod, aby zrobić to, co chceszSystem.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)); } }
źródło
Nullable.GetUnderlyingType(type)
rozwiązanie, ponieważ jest bardziej jednoznaczne niżtype.GetGenericArguments()[0]
, przynajmniej w tym przypadku.Nullable.GetUnderlyingType
już zrób to natywnie. GetUnderlyingType zwraca wartość null, gdy typ nie ma wartości Nullable <> (źródło: msdn.microsoft.com/en-US/library/… )foreach (var info in typeof(T).GetProperties()) { var type = info.PropertyType; var underlyingType = Nullable.GetUnderlyingType(type); var returnType = underlyingType ?? type; }
źródło
Jak zauważył Yves M., jest to tak proste, jak poniżej.
var properties = typeof(T).GetProperties(); foreach (var prop in properties) { var propType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType; var dataType = propType.Name; }
źródło
Używam pętli, aby przejść przez wszystkie właściwości klasy, aby uzyskać typ właściwości. Używam następującego kodu:
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; }
źródło
Ta metoda jest łatwa, szybka i bezpieczna
public static class PropertyInfoExtension { public static bool IsNullableProperty(this PropertyInfo propertyInfo) => propertyInfo.PropertyType.Name.IndexOf("Nullable`", StringComparison.Ordinal) > -1; }
źródło