カスタム コントロールがあります。このカスタム コントロールは、Reflection を多用しています。カスタム コントロール アセンブリ内には、リフレクション マネージャーであるクラスがあります。コントロールに関連するすべてのリフレクションを処理します。PropertyInfo
実行することの 1 つは、 内のオブジェクトの各プロパティのオブジェクトをキャッシュすることDataSource
です。static
カスタム コントロール クラス内やアセンブリ内の他のサポート クラス内で簡単に使用できるようにしたいと考えています。問題は、このコントロールがいくつかの場所で異なるデータソースと共に使用され、それぞれに独自のPropertyInfo
オブジェクトのコレクションがあることです。
コントロールのインスタンスごとにインスタンスを持ち、カスタム コントロール アセンブリ内の他のクラスでも使用できるように、このクラスを作成する最良の方法は何でしょうか。
私が考えたことの 1 つは、カスタム コントロール クラスで作成したリフレクション マネージャーのインスタンスをプロパティに挿入することです / サポート クラスのコンストラクター (ala DI) を使用しますが、もっと良いパターンがあるかもしれません。知っている。
編集:不明瞭で申し訳ありません。プロジェクトは ASP.NET WebForms プロジェクトです。コントロールは、CompositeDataBoundControl
それが重要な場合です。
編集 2:私が持っているデザインと、それに見られる欠陥について詳しく説明します。使用されている (または複数のページで使用される予定の) カスタム コントロール クラスがあります。このコントロール内には、このクラスがあります (構文に誤りがあった場合は申し訳ありません。これは記憶から書いています)。これはクラス全体ではなく、ここに関連するものです。
public static class DataReflectionManager
{
private static Dictionary<string, PropertyInfo> _propertyInfos = new Dictionary<string, PropertyInfo>();
public static void RegisterDataSource(IEnumerable dataSource)
{
//Get the property info of each property of and
//stick it in the dictionary.
}
public static string GetValueByPropertyKey(object o, string key)
{
//Takes o and gets the value of property key by the PropertyInfo object.
return "";
}
}
このクラスを静的のままにすることはできません。そうしないと、カスタム コントロールのすべてのインスタンスでディクショナリが同じになり、それぞれが異なるタイプのオブジェクトを保持する独自のデータ ソースを持ちます。だから... 静電気が出ています。しかし、その後は?カスタム コントロール クラスだけで使用DataReflectionManager
する場合は、そこにインスタンスを作成するだけです。問題は、カスタム コントロールが列の型を使用することです。これらはすべてから継承され、ほとんどの継承列の型で DataReflection マネージャーを使用する関数ColumnBase
をColumnBase
持っています。abstract
そのため、インスタンスを渡すことができましたが、おそらくもっとインテリジェントなソリューションを探しています。