Pregunta

Tengo esta porción de código:

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

Tiene dos problemas:

  1. Por alguna razón OfType devuelve un IEnumerable vacía aunque debe devolver los atributos adecuados de ese tipo, y he comprobado. Ellos existen.
  2. Este es el problema grave. En lugar de añadir el atributo al que sustituye el antiguo atributo del mismo tipo con crmTypeAttribute. He marcado allowMultiple para ser verdad.

Puede alguien decirme lo que está mal con este código?
EDIT:
Por alguna razón que permite agregar sólo un atributo de un tipo de atributo, he añadido otro tipo de atributo en tiempo de ejecución y ha funcionado.

¿Fue útil?

Solución 2

Resulta que las necesidades de atributos para anular la propiedad TypeId de la clase de atributo y no deben tratarse como duplicado.
Ver aquí para los detalles, es muy oculto y debe mencionarse en GetAttributes como bien.

Otros consejos

Creo que su problema se deriva del hecho de que usted está haciendo caso omiso de la TypeDescriptionProvider regresar de la llamada AddAttributes.

Desde el reflector TypeDescriptor.AddAttributes:

atributos agrega la clase a nivel de la orientar tipo de componente.

Parámetros

type :. El Type del componente de destino

Atributos . Una serie de objetos Attribute añadir a la clase del componente

Valor de retorno . El TypeDescriptionProvider de nueva creación que se utiliza para agregar los atributos especificados

Siempre hay una nueva instancia creada TypeDescriptionProvider cuando se llama a este método estático. Usted debe confiar en este caso el proveedor recién creado al añadir nuevos atributos y también la consulta de atributos añadidos recientemente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top