Найти тип нулевых свойств через отражение
Я исследую свойства объекта посредством отражения и продолжаю обработку типа данных каждого свойства. Вот мой (уменьшенный) источник:
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;
}
}
Моя проблема в том, что мне недавно нужно обрабатывать свойства с возможностью NULL, но я не знаю, как получить тип свойства nullable.
Ответы
Ответ 1
возможное решение:
propertyType = propertyInfo[propertyInfoIndex].PropertyType;
if (propertyType.IsGenericType &&
propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
propertyType = propertyType.GetGenericArguments()[0];
}
Ответ 2
Nullable.GetUnderlyingType(fi.FieldType)
выполнит работу для вас, чтобы проверить код ниже, чтобы сделать то, что вы хотите
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));
}
}
Ответ 3
foreach (var info in typeof(T).GetProperties())
{
var type = info.PropertyType;
var underlyingType = Nullable.GetUnderlyingType(type);
var returnType = underlyingType ?? type;
}
Ответ 4
Этот метод прост, быстр и безопасен
public static class PropertyInfoExtension {
public static bool IsNullableProperty(this PropertyInfo propertyInfo)
=> propertyInfo.PropertyType.Name.IndexOf("Nullable`", StringComparison.Ordinal) > -1;
}
Ответ 5
Я использую цикл, чтобы пройти через все свойства класса, чтобы получить тип свойства. Я использую следующий код:
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;
}