Domanda

Ho questa porzione di codice:

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

Si ha due problemi:

  1. Per qualche ragione OfType restituisce un IEnumerable vuota anche se dovrebbe restituire i giusti attributi di quel tipo, e ho controllato. Loro esistono.
  2. Questo è il problema grave. Invece di aggiungere l'attributo sostituisce il vecchio attributo dello stesso tipo con crmTypeAttribute. Ho segnato AllowMultiple per essere vero.

Qualcuno può dirmi che cosa c'è di sbagliato con questo codice?
EDIT:
Per qualche motivo permette di aggiungere un solo attributo di un tipo di attributo, ho aggiunto un altro tipo di attributo in fase di esecuzione e ha funzionato.

È stato utile?

Soluzione 2

Si scopre che le esigenze attributo per ignorare la proprietà TypeId della classe Attribute di non essere trattati come duplicato.
Vedere qui per i dettagli, è molto nascosto e dovrebbe essere menzionato nel GetAttributes come bene.

Altri suggerimenti

Credo che il problema nasce dal fatto che si sta ignorando il TypeDescriptionProvider restituita dalla chiamata AddAttributes.

Da riflettore su TypeDescriptor.AddAttributes:

Aggiunge classe a livello attribuisce al bersaglio tipo di componente.

Parametri

Tipo :. La Type del componente di destinazione

Attributi :. Una serie di Attribute oggetti da aggiungere alla classe del componente

Valore di ritorno :. Il TypeDescriptionProvider appena creato che è stato utilizzato per aggiungere gli attributi specificati

C'è sempre una nuova istanza TypeDescriptionProvider creato quando si chiama quel metodo statico. Si dovrebbe fare affidamento su questa istanza del provider appena creato quando si aggiungono ulteriori attributi e anche l'esecuzione di query per gli attributi di recente aggiunto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top