質問

C# で次のことを行う方法はありますか?

  1. 属性を持つクラスのすべてのプロパティを取得します (すべてのプロパティをループしてから属性が存在するかどうかを確認する必要はありません)。

  2. すべての Public、Internal、Protected プロパティが必要で、プライベート プロパティは必要ない場合、それを行う方法が見つかりません。私にはこれしかできません:

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

プライベートプロパティの取得を避け、他のすべてを取得する方法はありますか。

役に立ちましたか?

解決

これらのいずれかを行う方法があるとは思わない。

ただし、反映する必要がある型の数はいくつですか?それは本当にボトルネックですか?結果をキャッシュして、タイプごとに複数回行う必要を回避できますか?

他のヒント

キャッシングについて:プロパティにアクセスする場合 TypeDescriptor.GetProperties そうすれば無料でキャッシングが受けられます。の TypeDescriptor class には、このようなリフレクション状況に対応する他の優れたユーティリティ メソッドがいくつかあります。のみ動作します public ただしプロパティ (いいえ protected または internal メンバー、フィールドなし)。

実際にそれを行う方法はありませんより速い-しかし、あなたができることは、データをキャッシュすることでそれを少なくすることです。これを行うには、汎用ユーティリティクラスを使用すると便利です。たとえば、次のとおりです。

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)への応答:問題のクラス/アセンブリの外にいる場合、 internal および protected private

これらにアクセスしたい場合は、すでに行ったようにすべてのプロパティを要求し、リストを自分でフィルタリングする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top