我几天来一直在讨论这个问题: 我有一个课程信息
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中添加信息。这是我提出的最好的解决方案。保存信息的类不一定需要是字典,因为在第二步中,我想询问具有潜在安全相关属性的实例,如果它确实相关的话。所以我可以在“安全相关信息容器”的方法中传递该属性,并询问该属性是否相关。
所以我基本上都在询问是否有人更好地存储该信息或访问它,因为我仍然不喜欢这个解决方案。
以下是关于该问题的一般性结论:
编辑:由于我没有想出更好的主意,我实施了第三个解决方案,但是使用了属性名称的字符串。但是当我使用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类实例时,我都不想将任何元信息附加到该属性。我想在用户界面中显示元信息,并为用户提供有关该属性的更多信息。 所以我知道何时分配元信息,但不能在设计时把它放在类中。希望现在澄清一下: - )