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)
  }
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top