리플렉션을 통해 nullable 속성 유형 찾기


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

내 문제는 새로 nullable 속성을 처리해야하지만 nullable 속성의 유형을 얻는 방법에 대한 단서가 없다는 것입니다.


나는 시도 할 가치가 있는 좋은 대답을 여기에서 찾는다 !!
이츠하크 와인버그

답변:


131

가능한 해결책:

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

2
Nullables에 대한 올바른 검사는 MSDN에도 언급되어 있습니다 : msdn.microsoft.com/en-us/library/ms366789.aspx . 필요한 경우 주제에 대한 더 많은 리소스를 찾을 수 있습니다.
Oliver

76
한 줄로 할 수 있습니다! :propertyType = Nullable.GetUnderlyingType(propertyType) ?? propertyType
Yves M.

6
propertyType.IsGenericType전에 실제로 필요합니다 propertyType.GetGenericTypeDefinition(). 그렇지 않으면 예외가 발생합니다. +1
Mike de Klerk

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].
Oliver

5
당신은 IsGenericType 및 GetGenericTypeDefinition을 확인하지 않아도 , Nullable.GetUnderlyingType이미 기본적으로 그렇게. GetUnderlyingType은 형식이 Nullable <>이 아닐 때 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;
  }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.