Atributos podem ser adicionados dinamicamente em c #?

É possível adicionar atributos em tempo de execução ou alterar o valor de um atributo em tempo de execução?

Atributos são metadados estáticos. Assemblies, módulos, tipos, membros, parâmetros e valores de retorno não são objects de primeira class em C # (por exemplo, a class System.Type é meramente uma representação refletida de um tipo). Você pode obter uma instância de um atributo para um tipo e alterar as propriedades se elas forem graváveis, mas isso não afetará o atributo à medida que for aplicado ao tipo.

Isso realmente depende do que exatamente você está tentando realizar.

O material System.ComponentModel.TypeDescriptor pode ser usado para adicionar atributos a tipos, propriedades e instâncias de object, e tem a limitação de que você deve usá-lo para recuperar essas propriedades também. Se você está escrevendo o código que consome esses atributos, e você pode viver dentro dessas limitações, então eu definitivamente o sugeriria.

Tanto quanto eu sei, o controle PropertyGrid e a superfície de design de estúdio visual são as únicas coisas na BCL que consomem o material TypeDescriptor. Na verdade, é assim que eles fazem cerca de metade das coisas que realmente precisam fazer.

Bem, só para ser diferente, encontrei um artigo que faz referência usando Reflection.Emit para fazer isso.

Aqui está o link: http://www.codeproject.com/KB/cs/dotnetattributes.aspx , você também vai querer examinar alguns dos comentários na parte inferior do artigo, porque possíveis abordagens são discutidas.

Você não pode. Uma solução alternativa pode ser gerar uma class derivada em tempo de execução e adicionar o atributo, embora isso seja provavelmente um pouco exagerado.

Não, não é.

Atributos são metadados e armazenados em formato binário na assembly compilada (também é por isso que você só pode usar tipos simples neles).

Eu não acredito. Mesmo se estiver errado, o melhor que você pode esperar é adicioná-los a um Type inteiro, nunca uma instância de um Type.

Se você precisar de algo para ser adicionado dinamicamente, os atributos c # não são o caminho. Procure armazenar os dados em xml. Eu recentemente fiz um projeto que eu comecei com atributos, mas finalmente mudei para serialização w / xml.

Por que você precisa? Os atributos fornecem informações extras para reflection, mas se você souber externamente quais propriedades deseja, não precisará delas.

Você pode armazenar metadados externamente com relativa facilidade em um database ou arquivo de resources.

Eu tentei muito com System.ComponentModel.TypeDescriptor sem sucesso. Isso não significa que não pode funcionar, mas gostaria de ver código para isso.

Em contrapartida, eu queria mudar alguns valores de atributo. Eu fiz 2 funções que funcionam bem para esse fim.

  // ************************************************************************ public static void SetObjectPropertyDescription(this Type typeOfObject, string propertyName, string description) { PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName]; var att = pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute; if (att != null) { var fieldDescription = att.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance); if (fieldDescription != null) { fieldDescription.SetValue(att, description); } } } // ************************************************************************ public static void SetPropertyAttributReadOnly(this Type typeOfObject, string propertyName, bool isReadOnly) { PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName]; var att = pd.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute; if (att != null) { var fieldDescription = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); if (fieldDescription != null) { fieldDescription.SetValue(att, isReadOnly); } } } 

Em Java, costumava contornar isso usando um mapa e implementando minha própria codificação de valor-chave.

http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html