Eu tenho uma classe, vamos chamá-lo de livro com uma propriedade chamada nome. Com essa propriedade, tenho um atributo associado a ela.
public class Book
{
[Author("AuthorName")]
public string Name
{
get; private set;
}
}
No meu método principal, estou usando a reflexão e desejo obter o par de valores-chave de cada atributo para cada propriedade. Portanto, neste exemplo, eu esperaria ver "Autor" para o nome do atributo e "AuthorName" para o valor do atributo.
Pergunta: Como obtenho o nome e o valor do atributo em minhas propriedades usando o Reflection?
c#
reflection
propertyinfo
developerdoug
fonte
fonte
Respostas:
Use
typeof(Book).GetProperties()
para obter uma matriz dePropertyInfo
instâncias. Em seguida, useGetCustomAttributes()
em cada um delesPropertyInfo
para ver se algum deles tem oAuthor
tipo de atributo. Se o fizerem, você pode obter o nome da propriedade nas informações da propriedade e os valores do atributo.Algo ao longo dessas linhas para varrer um tipo em busca de propriedades que tenham um tipo de atributo específico e retornar dados em um dicionário (observe que isso pode ser mais dinâmico, passando tipos para a rotina):
fonte
Para obter todos os atributos de uma propriedade em um dicionário, use este:
lembre-se de mudar de
false
paratrue
se você deseja incluir também atributos herdados.fonte
Se você deseja apenas um valor de Atributo específico. Por exemplo, Exibir Atributo, você pode usar o seguinte código:
fonte
Resolvi problemas semelhantes escrevendo um Auxiliar de atributo de propriedade de extensão genérica:
Uso:
fonte
Fields
?Você pode usar
GetCustomAttributesData()
eGetCustomAttributes()
:fonte
Se você quer dizer "para atributos que usam um parâmetro, liste os nomes dos atributos e o valor do parâmetro", isso é mais fácil no .NET 4.5 por meio da
CustomAttributeData
API:fonte
fonte
Embora as respostas mais votadas acima funcionem definitivamente, eu sugiro usar uma abordagem ligeiramente diferente em alguns casos.
Se sua classe tem várias propriedades sempre com o mesmo atributo e você deseja classificá-los em um dicionário, veja como:
Isso ainda usa conversão, mas garante que a conversão sempre funcione, pois você obterá apenas os atributos personalizados do tipo "AuthorName". Se você tivesse vários atributos acima, as respostas receberiam uma exceção de elenco.
fonte
Uso:
ou:
fonte
Aqui estão alguns métodos estáticos que você pode usar para obter o MaxLength ou qualquer outro atributo.
Usando o método estático ...
Ou usando o método de extensão opcional em uma instância ...
Ou usando o método estático completo para qualquer outro atributo (StringLength por exemplo) ...
Inspirado pela resposta de Mikael Engver.
fonte
Necromante.
Para aqueles que ainda precisam manter o .NET 2.0, ou aqueles que desejam fazê-lo sem o LINQ:
Exemplo de uso:
ou simplesmente
fonte
Neste exemplo, usei DisplayName em vez de Author porque ele possui um campo chamado 'DisplayName' a ser mostrado com um valor.
fonte
para obter atributo de enum, estou usando:
// Usando
fonte
Apenas procurando o lugar certo para colocar esse código.
digamos que você tenha a seguinte propriedade:
E você deseja obter o valor ShortName. Você pode fazer:
Ou para torná-lo geral:
fonte