2012-09-13 1 views
2

Я 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 , Я НЕ хочу прикреплять какую-либо метаинформацию к этому свойству. Я хочу показать эту метаинформацию в пользовательском интерфейсе и предоставить пользователю дополнительную информацию об этом свойстве. Так что я знаю, когда назначать метаинформацию, но не могу положить ее в классы во время разработки. Надеюсь, это прояснит это сейчас :-)

+0

Ваша первая попытка выглядит правильно. Просто не забудьте поместить атрибут в свойства вида Info, а не в самой информации класса. –

+0

Ну, первый «взгляд» правильный, но это не так ;-) Потому что, каждый раз, когда вы получаете доступ к атрибуту, он будет вновь создан, избегая любой настойчивости, как указано здесь http://stackoverflow.com/questions/51269/change- attributes-parameter-at-runtime – derape

+0

Я не понимаю. Что вы хотите сохранить? Не является ли значение вашего атрибута выбранным разработчиком класса, использующим ваш код? Ваш вопрос позволяет мне думать, что это статическое значение, а не переменное. –

ответ

0

Как я уже сказал в вопросе, мы внедрили третье решение, хотя мне все еще не нравится. Если кто-то придумает лучшее решение, сообщите мне :-)