通过反射查找可为空的属性的类型


83

我通过反射检查对象的属性,然后继续处理每个属性的数据类型。这是我的(精简版)资源:

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

我的问题是,我新需要处理可为空的属性,但是我不知道如何获取可为空的属性的类型。


在这里找到了很好的答案值得尝试!
伊扎克·温伯格

Answers:


130

可能的解决方案:

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

2
MSDN上还提到了对Nullables的正确检查:msdn.microsoft.com/en-us/library/ms366789.aspx。如果需要,您可以在此处找到有关该主题的更多资源。
奥利弗

76
可以一行完成!propertyType = Nullable.GetUnderlyingType(propertyType) ?? propertyType
Yves M.

6
propertyType.IsGenericType在之前确实需要propertyType.GetGenericTypeDefinition(),否则将引发异常。+1
Mike de Klerk 2015年

37

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

    }

5
我喜欢这种Nullable.GetUnderlyingType(type)解决方案,因为type.GetGenericArguments()[0]至少在这种情况下,它比更加明确。
奥利弗

5
无需检查IsGenericType和GetGenericTypeDefinitionNullable.GetUnderlyingType就已经可以在本地执行此操作。当类型不是Nullable <>时,GetUnderlyingType返回null(来源: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

我正在使用循环遍历所有类属性以获取属性类型。我使用以下代码:

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

这种方法简单,快速,安全

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

0

正如Yves M.指出的那样, 它很简单。

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

  foreach (var prop in properties)
  {
     var propType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
     var dataType = propType.Name;
  }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.