Я agaonizing об этой проблеме в течение нескольких дней: У меня есть класс InfoСохранение мета информации к свойствам класса
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, например IsNot Relevant.Prop.No => IsRelevant = false.
Но, насколько я понял, метаинформация (атрибуты) для класса - это экземпляр, созданный один раз для каждого типа. Так что, если я изменить значения пользовательских атрибутов я изменю его для всех экземпляров этого класса (потому что он связан с этим типом !?)
Edit: Это не может быть сделано, как указано здесь: Change Attribute's parameter at runtime Everytime вы получаете доступ к пользовательским атрибутам, будет создан новый экземпляр со значениями по умолчанию. Изменения этого атрибута там не будут сохранены.
Второй подход должен был хранить эту информацию во внешнем классе и сохранять все пути модели и т. Д. Мне это не нравится, потому что информация относится к определенному классу.
Третий подход был реализован интерфейс, который держит словарь, который хранит эту информацию:
public interface ISecRelevant
{
Dictionary<PropertyInfo, bool> SecInfo { get; set; }
}
, а затем каждый класс, который имеет отношение к безопасности собственности должны были бы его реализовать. При каждом экземпляре этого класса информация должна быть добавлена в dicationary. Это лучшее решение, с которым я придумал. Класс, который содержит информацию, необязательно должен быть словарем, потому что на втором этапе я хочу спросить экземпляр с потенциальным свойством безопасности, если он действительно имеет значение. Поэтому я мог просто передать это свойство в методе этого «контейнера информационной безопасности» и спросить, имеет ли свойство значение.
Так что я в основном спрашиваю, есть ли у кого-то лучшее представление о том, чтобы хранить эту информацию или получить к ней доступ, потому что мне все равно не нравится решение.
Так вот некоторые общие выводы о этой проблеме:
- информации является ли свойство отношения к безопасности не является на самом деле информацией во время выполнения, но доступна заранее.Поэтому в идеале я хотел бы сохранить его «статическим» способом
- Информация лучше всего привязываться к свойству, по крайней мере, к родительскому классу, поскольку только он должен знать об этой информации, а не о любом другом классе, который использует что класс Info избегает связи
- Есть много других важных для безопасности свойств, которые рассеиваются по гораздо большему количеству классов. Они также используются в более глубокой и сложной иерархии объектов, но я думал, что это в основном сводится к проблеме, которую я описал здесь.
Edit: Поскольку я не придумал лучшей идеей, я осуществил третье решение, но со строкой для имени свойства. Но затем я столкнулся с другой проблемой при использовании списков. Что произойдет, если у вас есть свойство List as с типом, который имеет свойство sec-related? Список должен был бы знать, где он сидит, чтобы включить добавление информации в каждом конкретном случае, который вставляется в список ...
При поиске я нашел еще один пост, 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 , Я НЕ хочу прикреплять какую-либо метаинформацию к этому свойству. Я хочу показать эту метаинформацию в пользовательском интерфейсе и предоставить пользователю дополнительную информацию об этом свойстве. Так что я знаю, когда назначать метаинформацию, но не могу положить ее в классы во время разработки. Надеюсь, это прояснит это сейчас :-)
Ваша первая попытка выглядит правильно. Просто не забудьте поместить атрибут в свойства вида Info, а не в самой информации класса. –
Ну, первый «взгляд» правильный, но это не так ;-) Потому что, каждый раз, когда вы получаете доступ к атрибуту, он будет вновь создан, избегая любой настойчивости, как указано здесь http://stackoverflow.com/questions/51269/change- attributes-parameter-at-runtime – derape
Я не понимаю. Что вы хотите сохранить? Не является ли значение вашего атрибута выбранным разработчиком класса, использующим ваш код? Ваш вопрос позволяет мне думать, что это статическое значение, а не переменное. –