存储元信息类的属性(Storing meta information to class proper

2019-09-22 10:01发布

我一直agaonizing有关此问题的一些日子:我有一个类信息

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 =假

但据我理解的元信息(属性)的一类是为每种类型创建一次的实例。 所以,如果我更改自定义的属性的值吾则改之为类的所有实例(因为它绑定到该类型!?)

编辑 :作为这里说这个不能做更改属性的运行时参数,您可以访问自定义属性每次,使用默认值的新实例将被创建。 更改该属性将不会被存储在那里。

第二种方法是存储在外部类的信息,并保存所有的模型路径等。我不喜欢这样,因为信息属于一个特定的类。

第三种方法是实现持有其存储信息的词典的界面:

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

然后每个具有安全相关财产类需要实现它。 在该类的实例每次,信息需要在dicationary以复加。 这是我想出了但最好的解决方案。 其保存的信息类并不一定需要是一本字典,因为在第二个步骤,我想问的实例与潜在的安全相关的财产,如果它确实是相关的。 所以,我可以只通过该属性在“安全性相关信息容器”的方法,并询问是否该属性是相关的。

所以我基本上是问,如果有人有更好的主意来存储信息或访问它,因为不知何故,我还是不喜欢的解决方案。

因此,这里有关于这一问题的一些一般性结论:

  • 属性是否是相关的安全信息是不是一个真正的运行时信息,但可用的前期。 所以,我非常希望将其存储在一个“静态”方式
  • 这些信息最好要附加到房地产,至少父类,因为只有它应该知道的信息,而不是它使用的是信息类以避免耦合任何其他类
  • 有这些scatterd在很多类更多的安全相关属性。 这些也被用于更深入和复杂的对象层次,但我认为它基本上可以归结为我在这里所描述的问题。

编辑:既然我没有想出一个更好的主意,我实现了第三个解决方案,但与属性名称的字符串。 但是如果使用列表,当我偶然到另一个问题。 如果你有一个清单,与具有仲有关的物业类型属性会发生什么? 名单必须知道在那里坐以允许添加的信息,每一个插入List实例...

尽管搜索,我发现另一篇文章中,basicallay询问同样的事情: C# -加当我分配一个值类的字段关联到一个特定领域的一些元数据? 他建议实行持有这类信息的基类。 这将为“正常”属性的作用。 但不适合列表情况。

进一步的解释和例子:

我以为例如用“相关的安全”是帮助你们了解的问题,但也许它只是让你感到困惑。 简单地说:我需要附上元信息的一类(也被可能包含在列表中的项目)的任何财产。 当我需要把这些信息在设计时是已知的,但依赖于类的instanciation。 所以这非常重要是谁instanciating类。 这也是为什么我不能用静态信息的原因。 下面是一个例子:

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类的实例,另一方面,我不想对任何元信息到该属性附加。 我要显示在用户界面中的元信息,并为用户提供有关该属性的详细信息。 所以我知道什么时候分配的元信息,但不能把它的类在设计时。 希望这阐明它现在:-)

文章来源: Storing meta information to class properties