TypeDescriptor.AddAttributes () ersetzt die aktuelle Attribut insead es hinzuzufügen
-
10-10-2019 - |
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:
- Aus irgendeinem Grund OfType gibt eine leere IEnumerable obwohl es sollte die richtigen Attribute dieses Typs zurückgeben, und ich überprüft. Sie existieren.
- 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.
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 ZielkomponenteAttribute . Eine Reihe von
Attribute
Objekten in der Komponente Klasse hinzuzufügenRü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.