ASP.NET Может объект получает свои атрибуты - PullRequest
0 голосов
/ 14 мая 2009

Рассмотрим следующий пользовательский атрибут:

[Abc.Text(MaxLength=33)]
public Abc.Text heading = new Abc.Text();

MaxLength определяется в классе TextAtrribute:

public class TextAttribute : Attribute
{
  public int MaxLength {get; set;}

}

В другом моем коде класс Text должен знать свой MaxLength.

Есть ли способ, которым я мог бы сделать что-то вроде этого:

int max = (int)heading.GetAttribute("MaxLength");

Комментарии к ответам

Эта модификация ответа RexM сработала:

System.Reflection.FieldInfo headingField = this.GetType().GetField("heading");
object[] attribs = headingField.GetCustomAttributes(typeof(Abc.TextAttribute), true);

if (attribs.Length == 1)
{
  int max = ((Abc.TextAttribute)attribs[0]).AbcMaxLength;
}

Но я надеялся, что смогу сделать это без ссылки на «этого», родителя поля. Можете ли вы получить родителя поля как-нибудь? Это решило бы, например,

System.Reflection.FieldInfo headingField = heading.GetParent().GetType().GetField("heading");

Ответы [ 2 ]

3 голосов
/ 14 мая 2009

Используйте метод GetCustomAttributes () для Типа вашего текущего объекта. Это вернет массив объектов, представляющих экземпляр (ы) атрибутов этого типа, которые имеют указанный вами тип атрибута:

object[] attribs = this.GetType().GetCustomAttributes(typeof(Abc.Text));
if (attribs.Length == 1)
{
    int max = ((Abc.Text)attribs[0]).MaxLength;
}

Редактировать: ОК, с вашими разъяснениями я немного лучше понимаю, что вы пытаетесь сделать. Я думаю, что я неправильно прочитал ваш пример кода в первый раз. По сути, это та же концепция, но атрибут находится в поле, а не в классе:

System.Reflection.FieldInfo headingField = this.GetType().GetField("heading");
object[] attribs = headingField.GetCustomAttributes(typeof(Abc.Text));
if (attribs.Length == 1)
{
    int max = ((Abc.Text)attribs[0]).MaxLength;
}

Снова отредактируйте: чтобы получить указатель на поле, вы должны знать тип, на котором живет поле. Простой способ - использовать this.GetType(), но вы также можете сделать что-то вроде:

FieldInfo headingField = typeof(MyClass).GetField("heading");
0 голосов
/ 14 мая 2009

Вы можете прочитать здесь , как делать то, что вы хотите.

Type type = TextAttribute.GetType();
PropertieInfo pi = type.GetProperty("MaxLength");
if (pi.CanRead())
  //the value
  pi.GetValue();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...