C# 使用属性进行反射优化。

C# 使用属性进行反射优化。,c#,reflection,attributes,C#,Reflection,Attributes,在C#中有没有办法: 获取具有属性的类的所有属性(而不是必须遍历所有属性,然后检查属性是否存在) 如果我想要所有公共、内部和受保护的属性,但不想要私有属性,我找不到这样做的方法。我只能这样做: PropertyInfo[]props=type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) 有没有办法避免得到私人财产,但要得到其他一切。我认为没有办法做到这两个 但是,您需要考虑

在C#中有没有办法:

  • 获取具有属性的类的所有属性(而不是必须遍历所有属性,然后检查属性是否存在)

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

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


  • 有没有办法避免得到私人财产,但要得到其他一切。

    我认为没有办法做到这两个

    但是,您需要考虑多少类型?这真的是一个瓶颈吗?您是否能够缓存结果以避免每个类型重复执行一次以上操作?

    响应(2):如果您在所讨论的类/程序集之外,
    内部
    受保护
    私有
    相同


    如果你想访问这些属性,你需要像已经做的那样请求所有属性,然后自己过滤列表。

    关于缓存:如果你通过
    TypeDescriptor.GetProperties
    访问属性,那么你就可以免费获得缓存。
    TypeDescriptor
    类还有一些很好的实用方法用于反射情况ns是这样的。它只在
    公共
    属性上运行(没有
    受保护的
    内部
    成员,也没有字段)。

    实际上没有更快的方法,但可以做的是通过缓存数据来减少操作的频率。通用实用程序类可以是一种方便的方法,例如:

    static class PropertyCache<T>
    {
        private static SomeCacheType cache;
        public static SomeCacheType Cache
        {
            get
            {
                if (cache == null) Build();
                return cache;
            }
        }
        static void Build()
        {
            /// populate "cache"
        }
    }
    
    静态类属性缓存
    {
    私有静态SomeCacheType缓存;
    公共静态SomeCacheType缓存
    {
    得到
    {
    if(cache==null)Build();
    返回缓存;
    }
    }
    静态void Build()
    {
    ///填充“缓存”
    }
    }
    

    然后,您的PropertyCache.Cache具有仅用于Foo等的数据-具有惰性填充。如果愿意,您也可以使用静态构造函数。

    Private properties?属性的目的是公开您的私有实例字段。不确定为什么您首先需要私有属性。我不需要私有属性。这就是问题所在TypeDescriptor的缓存实际上相当有限,部分原因是它必须处理扩展属性之类的场景。