16

我想使用反射来获取属性类型。这是我的代码

var properties = type.GetProperties();
foreach (var propertyInfo in properties)
{
     model.ModelProperties.Add(
                               new KeyValuePair<Type, string>
                                               (propertyInfo.PropertyType.Name,
                                                propertyInfo.Name)
                              );
}

这段代码没问题propertyInfo.PropertyType.Name,但如果我的属性类型是Nullable我得到这个Nullable'1字符串,如果写FullName如果得到这个搅拌System.Nullable1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

4

2 回答 2

31

更改您的代码以查找可为空的类型,在这种情况下,将 PropertyType 作为第一个泛型参数:

var propertyType = propertyInfo.PropertyType;

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

model.ModelProperties.Add(new KeyValuePair<Type, string>
                        (propertyType.Name,propertyInfo.Name));
于 2013-02-16T13:18:35.707 回答
12

这是一个老问题,但我也遇到了这个问题。我喜欢@Igoy 的答案,但如果类型是可空类型的数组,它就不起作用。这是我处理可为空/泛型和数组的任何组合的扩展方法。希望它对有同样问题的人有用。

public static string GetDisplayName(this Type t)
{
    if(t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>))
        return string.Format("{0}?", GetDisplayName(t.GetGenericArguments()[0]));
    if(t.IsGenericType)
        return string.Format("{0}<{1}>",
                             t.Name.Remove(t.Name.IndexOf('`')), 
                             string.Join(",",t.GetGenericArguments().Select(at => at.GetDisplayName())));
    if(t.IsArray)
        return string.Format("{0}[{1}]", 
                             GetDisplayName(t.GetElementType()),
                             new string(',', t.GetArrayRank()-1));
    return t.Name;
}

这将处理像这样复杂的情况:

typeof(Dictionary<int[,,],bool?[][]>).GetDisplayName()

回报:

Dictionary<Int32[,,],Boolean?[][]>
于 2013-12-19T05:52:55.057 回答