3

私は数日間、この問題について繰り返し考えてきました: 私はクラス情報を持っています

public class Info
  {
    private int _no;

    public int No
    {
      get
      {
        return _no;
      }
      set
      {
        _no = value;
      }
    }
  }

そのクラスは、任意のクラスのどこでも (継承またはプロパティとして) 使用できます。プロパティは、セキュリティに関連するかどうかと見なすことができます。その情報は設計時に認識されており、その特定のプロパティ用に保存する必要があります。

したがって、そのクラスをプロパティとして使用する一部のクラスでは、それに応じてメンバー「いいえ」を設定する必要があります。

  public class IsRelevant
  {
    private Info _prop = new Info();
    public Info Prop { get { return _prop; } set { _prop = value; } }
  }

  public class IsNotRelevant
  {
    private Info _prop = new Info();
    public Info Prop { get { return _prop; } set { _prop = value; } }
  }

最初の試みとして、次のようなカスタム属性を導入することを考えていました:

[SecurityRelevant(RelevantLevel = SecurityRelevant.SecurityRelevant_Level1, IsRelevant = true)]

次に、クラス「IsRelevant」をインスタンス化したら、プロパティとそのクラスを調べて、必要に応じてカスタム属性を設定します。

IsRelevant.Prop.No => IsRelevant = true、たとえばIsNotRelevant.Prop.No => IsRelevant=false

しかし、私が理解している限り、クラスのメタ情報 (属性) は、タイプごとに 1 回作成されるインスタンスです。したがって、カスタム属性の値を変更すると、そのクラスのすべてのインスタンスに対して変更されます (そのタイプにバインドされているため!?)

編集: これは、次のように行うことはできません:実行時に属性のパラメーターを変更する カスタム属性にアクセスするたびに、デフォルト値を持つ新しいインスタンスが作成されます。その属性への変更はそこに保存されません。

2 番目のアプローチは、その情報を外部クラスに保存し、すべてのモデル パスなどを保存することでした。情報が特定のクラスに属しているため、私はそれが好きではありません。

3 番目のアプローチは、その情報を格納するディクショナリを保持するインターフェイスを実装することでした。

  public interface ISecRelevant
  {
    Dictionary<PropertyInfo, bool> SecInfo { get; set; }
  }

そして、セキュリティ関連のプロパティを持つすべてのクラスは、それを実装する必要があります。そのクラスをインスタンス化するたびに、辞書に情報を追加する必要があります。これは私が思いついた最善の解決策です。情報を保持するクラスは、必ずしもディクショナリである必要はありません。これは、2 番目のステップで、潜在的なセキュリティ関連プロパティを持つインスタンスに、それが本当に関連しているかどうかを問い合わせたいからです。したがって、そのプロパティを「セキュリティ関連の情報コンテナー」のメソッドに渡し、そのプロパティが関連しているかどうかを尋ねることができます。

だから私は基本的に誰かがその情報を保存したり、それにアクセスしたりするためのより良いアイデアを持っているかどうかを尋ねています.

そのため、この問題に関する一般的な結論を次に示します。

  • プロパティがセキュリティに関連しているかどうかの情報は、実際にはランタイム情報ではなく、事前に入手できます。理想的には、「静的」な方法で保存したいと思います
  • 結合を避けるためにその Info クラスを使用する他のクラスではなく、その情報について知る必要があるため、情報はプロパティ、少なくとも親クラスに添付するのが最善です。
  • より多くのクラスに散在する、より多くのセキュリティ関連のプロパティがあります。これらは、より深く複雑なオブジェクト階層でも使用されますが、基本的にはここで説明した問題に帰着すると思いました。

編集:より良いアイデアが思いつかなかったので、3 番目のソリューションを実装しましたが、プロパティ名に文字列を使用しました。しかし、リストを使用しているときに別の問題に遭遇しました。sec 関連のプロパティを持つタイプの List as プロパティがある場合はどうなりますか? リストに挿入されるすべてのインスタンスに情報を追加できるようにするには、リストがどこにあるかを知る必要があります...

検索中に別の投稿を見つけましたが、basicallay は同じことを求めています: C# - クラスのフィールドに値を割り当てるときに、特定のフィールドに関連付けられたメタデータを追加しますか? 彼は、その種の情報を保持する基本クラスを実装することを提案しています。これは、「通常の」プロパティで機能します。しかし、リストケースではありません。

詳細な説明と例:

「セキュリティ関連」の例は問題を理解するのに役立つと思いましたが、混乱しただけかもしれません。簡単に言うと、クラスの任意のプロパティにメタ情報を添付する必要があります(また、リストに含まれている可能性のあるアイテムにも)。この情報を配置する必要がある場所は、設計時にわかりますが、クラスのインスタンス化に依存します。したがって、誰がクラスをインスタンス化するかは重要です。これが、静的情報を使用できない理由でもあります。次に例を示します。

Class A {
  public int MetaProperty; // (this it the propert where i might want to add meta info)
}

Class B {
  public A ThePropertyWithMetadata;
}

Class C{
  public A TheProperty;
}

クラス B のインスタンスを作成するたびに、メタ情報をアタッチする必要があります

InstanceOfB.ThePropertyWithMetadata.MetaProperty

一方、クラス C のインスタンスを作成するときはいつでも、そのプロパティにメタ情報を追加したくありません。そのメタ情報をユーザー インターフェイスに表示し、そのプロパティに関する詳細情報をユーザーに提供したいと考えています。したがって、メタ情報をいつ割り当てるかはわかっていますが、設計時にクラスに入れることはできません。これで明確になることを願っています:-)

4

0 に答える 0