2016-07-10 4 views
2

У меня есть пользовательские атрибуты и классы, которые используют эти атрибуты. Эти атрибуты используются для Property Grid, когда объект класса выбран. В настоящее время оба класса и атрибуты находятся в одной и той же сборке. Внутри атрибутов у меня есть некоторые объекты Form. Из-за этих объектов Form я хочу сохранить атрибуты в отдельной сборке. Однако это приводит к циклической ссылке. Не могли бы вы помочь мне в этом вопросе?C# сохранение пользовательских атрибутов в отдельной сборке

Пример:

У меня есть бизнес-объект, свойство может быть отображено в PropertyGridControl:

public class Field 
    { 
     public Field() 
     { 

     } 

     private int _Type; 

     [CustomPropertyEditorMarker(typeof(RepositoryItemForFieldDataType))] 
     public int Type 
     { 
      get { return _Type; } 
      set 
      { 
       _Type = value; 
      } 
     } 
    } 

    [AttributeUsage(AttributeTargets.Property)] 
    public sealed class CustomPropertyEditorMarker : Attribute 
    { 
     public CustomPropertyEditorMarker(Type editorType) 
     { 
      EditorType = editorType; 
     } 

     public readonly Type EditorType; 
    } 

    public sealed class RepositoryItemForFieldDataType : RepositoryItemLookUpEdit 
    { 
     public RepositoryItemForFieldDataType() 
     { 
       // Populating LookupEdit details here 
     } 

     private void On_ButtonClick() 
     { 
      // Here initializing existing Form class and show it 
     } 
    } 

When Field object is selected, PropertGridControl analyze selected object and checking which property has above Attribute. If yes, then initialize it. 

     private void SelectObject(object obj) 
     { 
      this.Rows.Clear(); 
      this.DefaultEditors.Clear(); 
      this.RepositoryItems.Clear(); 

      if ((this.LastSelectedObject as ApplicationDomainItemBase) != null) 
      { 
       (this.LastSelectedObject as ApplicationDomainItemBase).IsSelected = false; 
      }; 

      this.SelectedObject = null; 

      this.SelectedObject = obj; 

      if (!(this.SelectedObject is ConfigurationObjectManagerBase)) 
      { 
       foreach (var propInfo in this.SelectedObject.GetType().GetProperties()) 
       { 
        object[] objFieldAtts = propInfo.GetCustomAttributes(typeof(CustomPropertyEditorMarker), true); 

        if (objFieldAtts != null && objFieldAtts.Length > 0) 
        { 
         if (this.GetRowByFieldName(propInfo.Name) != null) 
         { 
          RepositoryItem repItem = Activator.CreateInstance(((CustomPropertyEditorMarker)objFieldAtts[0]).EditorType) as RepositoryItem; 
          this.GetRowByFieldName(propInfo.Name).Properties.RowEdit = repItem; 
         }; 
        }; 
       }; 
      }; 

      this.LastSelectedObject = obj; 
     } 

В настоящее время оба классов бизнес-объектов и атрибутов находятся в одной сборке и должны разделить их. Однако я не могу, потому что свойство бизнес-объекта украшено именем атрибута и нужно будет добавить ссылку. Невозможно добавить ссылку, потому что классы атрибутов ссылаются на классы бизнес-объектов. Надеюсь, что это ясно. Благодарю.

+1

Почему проект, в котором вы перемещаете атрибуты, ссылается на проект, который использует эти атрибуты? Можете ли вы предоставить более подробную информацию о своих зависимостях? – user3185569

+0

@ user3185569, pls см. Правки. Благодарю. – Tim

+1

Я вижу только один класс атрибутов в вашем примере кода и не ссылается ни на один из других классов. Что мне не хватает. Я не вижу, что мешает вам переместить этот класс атрибутов в отдельную сборку, а затем ссылаться на эту сборку из проекта, который содержит ваши объекты домена. – wablab

ответ

0

Не видя ссылку бизнес-объект, который вызывает проблему, общий ответ заключается в следующем:

База бизнес-объектов на интерфейсы, которые будут объявлены в любом той же сборке, как, где вы хотите, чтобы переместить атрибуты , или другой «базовой» сборки. Затем обратитесь к бизнес-объектам в ваших атрибутах через их интерфейсы.

Смежные вопросы