【问题标题】:Reflection optimizations with attributes .带有属性的反射优化。
【发布时间】:2010-09-20 05:16:12
【问题描述】:

在 C# 中有没有办法:

  1. 获取具有属性的类的所有属性(而不必遍历所有属性然后检查属性是否存在。

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

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

有没有办法避免获得私有财产但确实获得其他一切。

【问题讨论】:

  • 私有财产?属性的重点是公开您的私有实例字段。不知道为什么你首先想要私有财产。
  • 我不想要私有财产。 .这就是如何避免它查看私有财产的问题。

标签: c# reflection attributes


【解决方案1】:

实际上并没有任何更快的方法 - 但您可以通过缓存数据来减少执行此操作的频率。通用实用程序类可能是一种方便的方法,例如:

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】:

    关于缓存:如果您通过TypeDescriptor.GetProperties 访问属性,那么您将免费获得缓存。 TypeDescriptor 类还有一些其他不错的实用方法,可用于此类反射情况。它只对public 属性起作用(没有protectedinternal 成员,也没有字段)。

    【讨论】:

    • TypeDescriptor 的缓存实际上是相当有限的,部分原因是它必须处理扩展属性等场景。
    【解决方案3】:

    针对 (2):如果您不在所讨论的班级/大会上,internalprotectedprivate 相同。

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

    【讨论】:

      【解决方案4】:

      我不相信有办法做到这两点。

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

      【讨论】: