2

C#で次の方法はありますか:

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

  2. すべてのパブリック、内部、および保護されたプロパティが必要で、プライベート プロパティは必要ない場合、それを行う方法が見つかりません。私はこれしかできません:

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

プライベート プロパティの取得を回避する方法はありますが、それ以外はすべて取得します。

4

4 に答える 4

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などのデータが含まれています。必要に応じて、静的コンストラクターを使用することもできます。

于 2008-10-31T21:40:13.720 に答える
2

キャッシングについて: 経由でプロパティにアクセスするTypeDescriptor.GetPropertiesと、キャッシングが無料になります。このTypeDescriptorクラスには、このようなリフレクションの状況のた​​めの便利なユーティリティ メソッドが他にもいくつかあります。publicただし、プロパティでのみ動作します (protectedまたはinternalメンバーなし、フィールドなし)。

于 2008-10-31T19:21:50.240 に答える
1

これらのいずれかを行う方法はないと思います。

しかし、どれだけ多くのタイプを熟考する必要がありますか? それは本当にボトルネックですか?タイプごとに複数回実行する必要がないように、結果をキャッシュできますか?

于 2008-10-31T15:57:20.137 に答える
1

(2) への対応: 問題のクラス/アセンブリの外にいて、internalprotected同じである場合private

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

于 2008-10-31T19:19:27.310 に答える