Как определить прикрепленный тип из пользовательского атрибута? - PullRequest
5 голосов
/ 09 ноября 2008

У меня есть пользовательский атрибут, который можно назначить классу, [FooAttribute]. Что я хотел бы сделать из атрибута, так это определить, какой тип на самом деле использовал меня. например Если у меня есть:

[FooAttribute]
public class Bar
{
}

В коде для FooAttribute, как я могу определить, что это был класс Bar, который добавил меня? Я не специально ищу тип Bar, я просто хочу задать дружественное имя, используя отражение. например,

[FooAttribute(Name="MyFriendlyNameForThisClass")]
public class Bar
{
}

public class FooAttribute()
{
  public FooAttribute()
  {
    // How do I get the target types name? (as a default)
  }
}

Ответы [ 4 ]

5 голосов
/ 09 ноября 2008

Во-первых, вы можете рассмотреть существующий [DisplayName] для сохранения дружеских имен. Как уже было сказано, вы просто не можете получить эту информацию внутри атрибута. Вы можете найти атрибут в Bar, но в общем случае единственный способ сделать это из атрибута - передать тип в атрибут - т.е.

[Foo("Some name", typeof(Bar)]

Что именно ты хочешь сделать? Могут быть и другие варианты ...

Обратите внимание, что для i18n, resx и т. Д .; вы можете создать подкласс DisplayNameAttribute и обеспечить поиск по ключам, переопределив DisplayName getter.

3 голосов
/ 09 ноября 2008

Для разработки. Атрибут, встроенный или пользовательский, - это просто метаданные для класса или члена класса, а сам атрибут не имеет обозначения, что он связан с чем-то.

  • Тип знает свои метаданные
  • Метаданные (в данном случае атрибут) не знают, кому они принадлежат
1 голос
/ 22 января 2009

Это неуклюже, но вы можете перебирать все классы в сборке, проверяя каждый на предмет пользовательского атрибута, который "является" этим экземпляром.

1 голос
/ 09 ноября 2008

Из вашего предложения «Я просто хочу установить понятное имя, используя отражение», я думаю, вы хотите установить имя «MyFriendlyNameForThisClass» для атрибута во время выполнения. если так, я не думаю, что это возможно. Пожалуйста, смотрите эту тему .

...