2016-07-10 17 views
2

Ich habe benutzerdefinierte Attribute und Klassen, die diese Attribute verwenden. Diese Attribute werden für das Eigenschaftenraster verwendet, wenn das Klassenobjekt ausgewählt ist. Derzeit befinden sich beide Klassen und Attribute in derselben Assembly. Innerhalb von Attributen habe ich einige Formularobjekte. Wegen dieser Formularobjekte möchte ich Attribute in einer separaten Assembly behalten. Allerdings ergibt sich daraus ein Zirkelbezug. Könnten Sie mir bitte in dieser Angelegenheit helfen?C# benutzerdefinierte Attribute in separaten Assembly beibehalten

Probe:

Ich habe Business-Objekt, dessen Eigenschaft kann in PropertyGridControl angezeigt:

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; 
     } 

Derzeit sowohl von Objektklassen Business und Attribute sind innerhalb derselben Baugruppe und müssen sie trennen. Dies kann ich jedoch nicht, da die Eigenschaft des Business-Objekts mit dem Attributnamen versehen ist und eine Referenz hinzugefügt werden muss. Ein Verweis kann nicht hinzugefügt werden, da Attributklassen auf Geschäftsobjektklassen verweisen. Hoffe es klar. Vielen Dank.

+1

Warum verweist das Projekt, in dem Sie die Attribute verschieben, auf das Projekt, das diese Attribute verwendet? Können Sie weitere Details zu Ihren Abhängigkeiten angeben? – user3185569

+0

@ user3185569, siehe Änderungen. Vielen Dank. – Tim

+1

Ich sehe nur eine Attributklasse in Ihrem Beispielcode und verweist auf keine der anderen Klassen. Was vermisse ich. Ich sehe nicht, was Sie davon abhält, diese Attributklasse in eine separate Assembly zu verschieben und dann auf diese Assembly aus dem Projekt, das Ihre Domänenobjekte enthält, zu verweisen. – wablab

Antwort

0

Ohne die Business-Objekt Referenz zu sehen, dass Ihr Problem verursacht, eine allgemeine Antwort lautet wie folgt:

Basis Ihrer Business-Objekte auf Schnittstellen, die entweder in der gleichen Assembly deklariert werden würden, wo Sie wollen Ihre Attribute bewegen oder eine andere "Basis" -Baugruppe. Beziehen Sie sich dann über ihre Schnittstellen auf die Business-Objekte in Ihren Attributen.