几天来我一直在思考这个问题:我有一个班级信息
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=false。
但据我了解,类的元信息(属性)是为每种类型创建一次的实例。因此,如果我更改自定义属性的值,我将为该类的所有实例更改它(因为它绑定到该类型!?)
编辑:这不能按照此处所述完成:在运行时更改属性的参数每次访问自定义属性时,都会创建一个具有默认值的新实例。对该属性的更改不会存储在那里。
第二种方法是将该信息存储在外部类中并保存所有模型路径等。我不喜欢这样,因为信息属于特定类。
第三种方法是实现一个接口,该接口包含一个存储该信息的字典:
public interface ISecRelevant
{
Dictionary<PropertyInfo, bool> SecInfo { get; set; }
}
然后每个具有安全相关属性的类都需要实现它。在该类的每个实例化上,都需要在字典中添加信息。这是我想出的最好的解决方案。保存信息的类不一定需要是字典,因为在第二步中,我想询问具有潜在安全相关属性的实例是否真的相关。所以我可以在“安全相关信息容器”的方法中传递该属性并询问该属性是否相关。
所以我基本上是在问是否有人有更好的主意来存储或访问它,因为不知何故我仍然不喜欢这个解决方案。
所以这里有一些关于这个问题的一般性结论:
- 属性是否与安全相关的信息并不是真正的运行时信息,而是预先可用的。所以理想情况下,我想以“静态”方式存储它
- 信息最好附加到属性上,至少附加到父类,因为只有它应该知道该信息,而不是使用该 Info 类以避免耦合的任何其他类
- 还有更多的安全相关属性分散在更多的类中。这些也用于更深和更复杂的对象层次结构,但我认为它基本上归结为我在这里描述的问题。
编辑:由于我没有想出更好的主意,我实现了第三个解决方案,但使用字符串作为属性名称。但是后来我在使用列表时偶然发现了另一个问题。如果您将 List 作为具有 sec 相关属性的类型的属性,会发生什么?列表必须知道它所在的位置,才能将信息添加到插入到列表中的每个实例......
在搜索时,我发现了另一篇文章,basallay 要求同样的事情: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 的实例时,我不想将任何元信息附加到该属性。我想在用户界面中显示该元信息并为用户提供有关该属性的更多信息。所以我确实知道何时分配元信息,但不能在设计时将其放入类中。希望这现在可以澄清:-)