将元信息存储到类属性

时间:2012-09-13 13:16:00

标签: c# implementation object-oriented-analysis

我几天来一直在讨论这个问题: 我有一个课程信息

public class Info
  {
    private int _no;

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

该类可以在任何类中的任何位置使用(继承或作为属性)。该财产可被视为与安全相关或不相关。该信息在设计时已知,需要存储该特定属性。

因此对于某些使用该类作为属性的类,我希望相应地设置成员“No”。

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

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

编辑:这不能按照此处所述完成:Change Attribute's parameter at runtime每次访问自定义属性时,都会创建一个具有默认值的新实例。对该属性的更改不会存储在那里。

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

第三种方法是实现一个包含存储该信息的字典的接口:

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

然后每个具有安全相关属性的类都需要实现它。 在该类的每个实例化中,需要在dationary中添加信息。这是我提出的最好的解决方案。保存信息的类不一定需要是字典,因为在第二步中,我想询问具有潜在安全相关属性的实例,如果它确实相关的话。所以我可以在“安全相关信息容器”的方法中传递该属性,并询问该属性是否相关。

所以我基本上都在询问是否有人更好地存储该信息或访问它,因为我仍然不喜欢这个解决方案。

以下是关于该问题的一般性结论:

  • 属性是否与安全性相关的信息实际上不是运行时信息,而是可用的。理想情况下,我想以“静态”方式存储它
  • 最好将信息附加到属性,至少附加到父类,因为只有它应该知道该信息,而不是任何其他使用该Info类以避免耦合的类
  • 还有更多安全相关属性分散在更多类中。这些也用于更深层次和更复杂的对象层次结构中,但我认为它基本上归结为我在此描述的问题。

编辑:由于我没有想出更好的主意,我实施了第三个解决方案,但是使用了属性名称的字符串。但是当我使用Lists时,我偶然发现了另一个问题。如果您将List作为具有sec相关属性的类型的属性会发生什么?列表必须知道它所处的位置,以便能够将信息添加到列表中插入的每个实例...

在搜索时我发现了另一篇帖子,basicallay要求同样的事情:C# - add some meta data associated to a particular field when I am assigning a value to the field of a class? 他建议实现一个包含这类信息的基类。这适用于“普通”属性。但不适用于列表案例。

进一步说明和示例:

我认为“安全相关”的例子正在帮助你们理解这个问题,但也许它只是让你感到困惑。简单地说:我需要将元信息附加到类的任何属性(以及可能包含在列表中的项)。我需要在设计时知道这些信息,但这取决于类的实例化。因此,谁在实施课程这一点很重要。这也是我无法使用静态信息的原因。 这是一个例子:

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类实例时,我都不想将任何元信息附加到该属性。我想在用户界面中显示元信息,并为用户提供有关该属性的更多信息。 所以我知道何时分配元信息,但不能在设计时把它放在类中。希望现在澄清一下: - )

0 个答案:

没有答案