1

カスタム コントロールがあります。このカスタム コントロールは、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 マネージャーを使用する関数ColumnBaseColumnBase持っています。abstractそのため、インスタンスを渡すことができましたが、おそらくもっとインテリジェントなソリューションを探しています。

4

2 に答える 2

2

Dictionary<>静的クラスのインスタンスを複数持つことはできないため、リフレクションマネージャーのコントロール固有のインスタンスを保持するコントロールクラス名でキー設定された静的クラスを追加することでこれを解決します。

于 2013-01-07T16:53:14.250 に答える
0

ここで「完璧な」解決策を見つけることができませんでした。これを行う方法はすべて、特定の設計にいくつかの欠点があるためです。

現在の解決策にたどり着くのに役立ったのは、ProperyInfoオブジェクトのリストがコントロールの特定のインスタンスに関連付けられているため、Dictionary<string, PropertyInfo>それを格納するために使用される もコントロール クラスのメンバーである必要があるという考えでした。これにより、リフレクション マネージャーを静的に保ち、サポートするクラスのコード変更を最小限に抑えることができました。

サポートするクラスPropertyInfoは、それぞれのコンストラクターで必要に応じてオブジェクトを取得します。

リフレクション マネージャーは、コントロール コンストラクターでのリフレクションを通じてディクショナリを作成し、それ以降、コントロールはそれを格納します。

于 2013-01-10T04:44:50.277 に答える