Tìm loại thuộc tính nullable thông qua phản chiếu


83

Tôi kiểm tra các thuộc tính của một đối tượng thông qua phản chiếu và tiếp tục xử lý kiểu dữ liệu của từng thuộc tính. Đây là nguồn (giảm) của tôi:

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

Vấn đề của tôi là, tôi mới cần xử lý các thuộc tính nullable, nhưng tôi không có manh mối nào để lấy loại thuộc tính nullable.


tôi tìm thấy câu trả lời tốt ở đây đáng để thử !!
Yitzhak Weinberg

Câu trả lời:


130

giải pháp khả thi:

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

2
Việc kiểm tra chính xác Nullables cũng được đề cập trên MSDN: msdn.microsoft.com/en-us/library/ms366789.aspx . Ở đó, bạn có thể tìm thêm một số tài nguyên về chủ đề này, nếu cần.
Oliver

76
Có thể được thực hiện trong một dòng! :propertyType = Nullable.GetUnderlyingType(propertyType) ?? propertyType
Yves M.

6
propertyType.IsGenericTypethực sự được yêu cầu trước đó propertyType.GetGenericTypeDefinition(), nếu không một ngoại lệ sẽ được ném ra. +1
Mike de Klerk

37

Nullable.GetUnderlyingType(fi.FieldType) sẽ làm công việc cho bạn, hãy kiểm tra mã bên dưới để làm điều bạn muốn

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
Tôi thích Nullable.GetUnderlyingType(type)giải pháp vì nó rõ ràng hơn type.GetGenericArguments()[0], ít nhất là trong trường hợp này.
Oliver

5
Bạn không cần phải kiểm tra IsGenericType và GetGenericTypeDefinition , Nullable.GetUnderlyingTypeđã có thể thực hiện điều đó ngay từ đầu. GetUnderlyingType đang trả về null khi loại không phải là Nullable <> (nguồn: msdn.microsoft.com/en-US/library/… )
Yves M. Ngày

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

0

Tôi đang sử dụng một vòng lặp để đi qua tất cả các thuộc tính của lớp để lấy loại thuộc tính. Tôi sử dụng mã sau:

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

Phương pháp này rất dễ dàng, nhanh chóng và an toàn

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

0

Như đã chỉ ra bởi Yves M. nó đơn giản như dưới đây.

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

  foreach (var prop in properties)
  {
     var propType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
     var dataType = propType.Name;
  }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.