GetRuntimeProperties而不是GetProperty

时间:2015-01-12 12:29:38

标签: c# reflection

我需要在泛型类型中找到属性。这是一种古老的方式(因为我的代码专用于WinRT,我相信我需要另一种方法):

PropertyInfo pi = typeof(TRp).GenericTypeArguments[0].GetProperty(idField, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);  

我需要使用GetRuntimeProperties获得相同的结果。这是我的方法:

PropertyInfo pi = typeof(TRp).GenericTypeArguments[0].GetRuntimeProperties().Single(p => p.Name.ToUpper() == idField.ToUpper()...  

你可以看到我以自定义的方式实现了IgnoreCase,可能它可以做得更好吗? 如何实施剩余的BindingFlags

谢谢!

1 个答案:

答案 0 :(得分:5)

你实际上不需要。这就是Type.GetRuntimeTypes的实施方式:

public static IEnumerable<PropertyInfo> GetRuntimeProperties(this Type type)
{
    CheckAndThrow(type);

    IEnumerable<PropertyInfo> properties = type.GetProperties(everything);
    return properties;
}

everything的定义如下:

private const BindingFlags everything = BindingFlags.Instance |
                                        BindingFlags.Public | 
                                        BindingFlags.NonPublic | 
                                        BindingFlags.Static;

这意味着它已经找到了你需要的标志。

修改

如果您想自己指定BindingFlags,可以编写自己的自定义扩展方法:

public static class TypeExtensions
{
    public static IEnumerable<PropertyInfo> GetAllProperties(this TypeInfo type, 
                                                             BindingFlags bindingFlags)
    {
        var propertyInfos = type.GetProperties(bindingFlags);

        var subtype = type.BaseType;
        if (subtype != null)
            list.AddRange(subtype.GetTypeInfo().GetAllProperties(bindingFlags));

        return propertyInfos.ToArray();
    }
}

请注意尚未经过测试。它只是试图告诉你你可以自己做。