TypeDescriptor.AddAttributes () sostituisce la corrente insead attributo di aggiungerlo
-
10-10-2019 - |
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:
- Per qualche ragione OfType restituisce un IEnumerable vuota anche se dovrebbe restituire i giusti attributi di quel tipo, e ho controllato. Loro esistono.
- 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.
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 destinazioneAttributi :. Una serie di
Attribute
oggetti da aggiungere alla classe del componenteValore 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.