Frage

Ich habe diesen Teil des Codes:

var hasAttribute = TypeDescriptor.GetAttributes(property.DeclaringType).OfType<CrmTypeAttribute>()
            .Any((attr)
                    => ((CrmTypeAttribute)attr).Name == property.Name);

            if (!hasAttribute)
            {
                var crmTypeAttribute = new CrmTypeAttribute(property.Name, crmType);
                TypeDescriptor.AddAttributes(property.DeclaringType, crmTypeAttribute);
            }

Es hat zwei Probleme:

  1. Aus irgendeinem Grund OfType gibt eine leere IEnumerable obwohl es sollte die richtigen Attribute dieses Typs zurückgeben, und ich überprüft. Sie existieren.
  2. Dies ist das schwere Problem. Anstatt das Attribut Hinzufügen ersetzt es das alte Attribut des gleichen Typs mit crmTypeAttribute. Ich habe AllowMultiple markiert wahr zu sein.

Kann jemand mir sagen, was mit diesem Code falsch?
EDIT:
Aus irgendeinem Grund erlaubt es nur ein Attribut eines Attributtyp hinzufügen, habe ich einen anderen Attributtyp zur Laufzeit hinzugefügt und es hat funktioniert.

War es hilfreich?

Lösung 2

Es stellte sich heraus, dass die Attribut Bedürfnisse der TypeId Eigenschaft der Attributklasse außer Kraft zu setzen, um nicht als dupliziert behandelt werden.
Siehe hier für Details, ist es sehr versteckt und soll in GetAttributes erwähnt werden Gut.

Andere Tipps

Ich denke, Ihr Problem rührt von der Tatsache, dass Sie die zurück TypeDescriptionProvider vom AddAttributes Anruf sind zu ignorieren.

Von Reflektor auf TypeDescriptor.AddAttributes:

Fügen Klasse-Level-Attribute des Zielkomponententyp.

Parameter

Typ . Die Type der Zielkomponente

Attribute . Eine Reihe von Attribute Objekten in der Komponente Klasse hinzuzufügen

Rückgabewert . Der neu geschaffene TypeDescriptionProvider, die verwendet wurde, um die angegebenen Attribute hinzufügen

Es gibt immer eine neue TypeDescriptionProvider Instanz erstellt, wenn die statische Methode aufrufen. Sie sollten auf dieser neu erstellten Provider Instanz verlassen, wenn weitere Attribute hinzufügen und auch für kürzlich hinzugefügten Attribute abfragen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top