Como determinar o tipo anexado a partir de um atributo personalizado?
-
07-07-2019 - |
Pergunta
Eu tenho um atributo personalizado que pode ser atribuído a uma classe, [FooAttribute]
. O que eu gostaria de fazer, de dentro do atributo, é determinar qual o tipo que realmente me usou. por exemplo. Se eu tenho:
[FooAttribute]
public class Bar
{
}
No código para FooAttribute, como posso determinar que era classe Bar que me adicionou? Eu não estou procurando especificamente para o tipo de bar, eu só quero definir um nome amigável usando a reflexão. por exemplo.
[FooAttribute(Name="MyFriendlyNameForThisClass")]
public class Bar
{
}
public class FooAttribute()
{
public FooAttribute()
{
// How do I get the target types name? (as a default)
}
}
Solução
Primeiro, você pode considerar o [DisplayName]
existente para manter nomes amigáveis. Como já foi coberto, você simplesmente não pode obter essa informação dentro do atributo. Você pode procurar o atributo de bar, mas, em geral, a única maneira de fazê-lo a partir do atributo seria passar o tipo em o atributo -. I
[Foo("Some name", typeof(Bar)]
O que exatamente é isso que você quer fazer? Pode haver outras opções ...
Note que para i18n, resx, etc; você pode subclasse DisplayNameAttribute
e fornecer pesquisa de chaves, substituindo o getter DisplayName
.
Outras dicas
Para elaborat. Um atributo, construído em ou costume, é apenas meta dados para uma classe ou membro da classe, e do próprio atributo NAS nenhuma notação que ele está sendo associado a algo.
- O tipo sabe de seu próprio metadados
- Os dados de meta (neste caso, o atributo) não sabe a quem pertence
Desde a sua frase "Eu só quero definir um nome amigável usando a reflexão" Eu acho que você deseja definir o nome "MyFriendlyNameForThisClass" para o atributo em tempo de execução. Se assim for, eu não acho que isso é possível. Por favor, consulte esta discussão .
Ele é desajeitado, mas você pode iterar sobre todas as classes no conjunto, testando cada um para o atributo personalizado que "é" neste caso.