質問
C# で次のことを行う方法はありますか?
属性を持つクラスのすべてのプロパティを取得します (すべてのプロパティをループしてから属性が存在するかどうかを確認する必要はありません)。
すべての 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 と同じですcode>。
これらにアクセスしたい場合は、すでに行ったようにすべてのプロパティを要求し、リストを自分でフィルタリングする必要があります。