使用GetRuntimeProperties替代GetProperty

6

我需要在泛型类型中查找属性。这是一种旧的方法(由于我的代码专为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个回答

10

实际上您不需要这样做。 Type.GetRuntimeProperties的实现方式如下:

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

请注意,这个没有被测试过。它仅仅是试图向您展示,您可以自己完成这个任务。


1
你是怎么弄明白它是如何实现的呢? - Jacek Wojcik
  1. 如果我想更改一些 BindingFlags,该怎么办?
- Jacek Wojcik
1
  1. 我在我的帖子中添加了一个链接(点击“Type.GetRuntimeTypes”)。
  2. 不幸的是,你不能这样做。
- Yuval Itzchakov
@JacekWojcik 请看我的编辑。我已经尝试自己检索类型。 - Yuval Itzchakov
看起来我不能在我的项目中使用 BindingFlags 类型 :-( - Jacek Wojcik
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接