使用属性进行反射优化。

时间:2008-10-31 15:53:11

标签: c# reflection attributes

C#中有没有办法:

  1. 获取具有属性的类的所有属性(相对于必须遍历所有属性,然后检查属性是否存在。

  2. 如果我想要所有公共,内部和受保护的属性但不是私有属性,我找不到这样做的方法。我只能这样做:

    PropertyInfo [] props = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)

  3. 有没有办法避免获得私人财产,但确实得到了其他所有财产。

4 个答案:

答案 0 :(得分:2)

关于缓存:如果您通过TypeDescriptor.GetProperties访问属性,那么您将免费获得缓存。对于像这样的反射情况,TypeDescriptor类有一些其他很好的实用方法。它仅在public属性上运行(没有protectedinternal成员,没有字段。

答案 1 :(得分:2)

实际上没有办法更快 - 但你可以做的是通过缓存数据来减少这种情况。通用实用程序类可以是一种方便的方法,例如:

static class PropertyCache<T>
{
    private static SomeCacheType cache;
    public static SomeCacheType Cache
    {
        get
        {
            if (cache == null) Build();
            return cache;
        }
    }
    static void Build()
    {
        /// populate "cache"
    }
}

然后你的PropertyCache.Cache只有Foo等数据 - 有懒惰的人口。如果您愿意,也可以使用静态构造函数。

答案 2 :(得分:1)

我不相信有办法做其中任何一种。

但是你需要反映出多少种类型?这真的是一个瓶颈吗?您是否能够缓存结果以避免每种类型多次执行此操作?

答案 3 :(得分:1)

回答(2):如果您不在相关课程/装配范围之内,internalprotectedprivate相同。

如果您想要访问这些内容,您需要像已经完成的那样询问所有属性,并自行过滤列表。