Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Контекст выполнени кода и атрибуты

713
30 сентября 2006 года
Ap0k
360 / / 13.03.2006
Код:
class SomeClass
{
    [ххх("some data")]
    public object Property
    {
         get
         {
              //делаем что-то в зависимости от значения атрибута xxx
         }
    }
}

Каким образхом можно замутить нечто подобное?
723
30 сентября 2006 года
Tommy
78 / / 13.10.2002
Короче в MSDN сморишь раздел..., даже нет просто печатаешь в поиске "Reflection Overview" затем идешьпо первой и второй сслыке и читаешь как там с атрибутами работать.
Ну а вообще использовать так:
 
Код:
this.GetFiled("xxx").GetCustomAttributes()

Находишь нужный атрибут и в зависимости от значений там что-то делаешь. В целом конечно подход другой. Но это слишком долгая история, если что пиши в аську 580758 и я там всё объясню.
713
30 сентября 2006 года
Ap0k
360 / / 13.03.2006
Как работать с атрибутами я знаю, и в принципе уже нашёл другое решение, тоже с атрибутами.. дело в том, что хотелось бы для общего развития сделать что-то такое, чтобы не писать "xxx", а програмно выяснить, в каком месте мы находимся (на каком этапе выполнения) и исходя из полученной информации получить атрибуты именно поля ("xxx").
Есть ли такая возможность?
Код:
class SomeClass
{
    [ххх("some data")]
    public object Property
    {
         get
         {
              //тут хотелось бы узнать , что это именно свойство с именем Property
              //делаем что-то в зависимости от значения атрибута xxx
         }
    }
}

Ещё раз повторюсь, практической пользы из этого извлечь не хочу, просто есть желание познать :)
273
05 октября 2006 года
3A3-968M
1.2K / / 22.12.2005
Вот держи, без всяких атрибутов:
Код:
[FONT=Courier New][SIZE=2][COLOR=#0000ff]public [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]enum [/COLOR][/SIZE][SIZE=2][COLOR=#008080]ExecutionContext[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New]{Method, Property};[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]public [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]static [/COLOR][/SIZE][SIZE=2][COLOR=#008080]MemberInfo[/COLOR][/SIZE][SIZE=2] GetExecutionContext([/SIZE][SIZE=2][COLOR=#0000ff]out [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][SIZE=2] contextName, [/SIZE][SIZE=2][COLOR=#0000ff]out [/COLOR][/SIZE][SIZE=2][COLOR=#008080]ExecutionContext[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] context)[/FONT]
[FONT=Courier New]{[/FONT]
[FONT=Courier New] System.Diagnostics.[/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]StackFrame[/COLOR][/SIZE][SIZE=2] topFrame = [/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] System.Diagnostics.[/SIZE][SIZE=2][COLOR=#008080]StackFrame[/COLOR][/SIZE][SIZE=2](1); [/SIZE][SIZE=2][COLOR=#008000]//получили вернхний относительно этого кадр стэка
[/COLOR][/SIZE][/FONT][FONT=Courier New][SIZE=2][COLOR=#008080] MemberInfo[/COLOR][/SIZE][SIZE=2] result = topFrame.GetMethod(); [/SIZE][SIZE=2][COLOR=#008000]//получаем caller'a
[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] contextName = result.Name;[/FONT]
[FONT=Courier New] context = [/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]ExecutionContext[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].Method;[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080] Type[/COLOR][/SIZE][SIZE=2] callerType = result.DeclaringType; [/SIZE][SIZE=2][COLOR=#008000]//получили тип, в котором сидит этот метод
[/COLOR][/SIZE][/FONT][FONT=Courier New][SIZE=2][COLOR=#0000ff] foreach[/COLOR][/SIZE][SIZE=2] ([/SIZE][SIZE=2][COLOR=#008080]PropertyInfo[/COLOR][/SIZE][SIZE=2] property [/SIZE][SIZE=2][COLOR=#0000ff]in[/COLOR][/SIZE][SIZE=2] callerType.GetProperties([/SIZE][SIZE=2][COLOR=#008080]BindingFlags[/COLOR][/SIZE][SIZE=2].Public | [/SIZE][SIZE=2][COLOR=#008080]BindingFlags[/COLOR][/SIZE][SIZE=2].NonPublic | [/SIZE][SIZE=2][COLOR=#008080]BindingFlags[/COLOR][/SIZE][SIZE=2].Instance | [/SIZE][SIZE=2][COLOR=#008080]BindingFlags[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].Static))[/FONT]
[FONT=Courier New] {[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]   if[/COLOR][/SIZE][SIZE=2] (property.GetGetMethod([/SIZE][SIZE=2][COLOR=#0000ff]true[/COLOR][/SIZE][SIZE=2]).Equals(result) || property.GetSetMethod([/SIZE][SIZE=2][COLOR=#0000ff]true[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New]).Equals(result))[/FONT]
[FONT=Courier New]   {[/FONT]
[FONT=Courier New]     contextName = property.Name;[/FONT]
[FONT=Courier New]     context = [/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]ExecutionContext[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].Property;[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]     return[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] property;[/FONT]
[FONT=Courier New]   }[/FONT]
[FONT=Courier New] }[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] return[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] result;[/FONT]
[FONT=Courier New]}[/FONT]
[/SIZE]

Данная функция при вызове возвращает тебе информацию о месте вызова. Если ты вызвал эту функцию в get или set теле свойства, то функция вернёт значение ExecutionContext.Property и имя свойства. Если вызов в методе, значит функция вернёт ExecutionContext.Method. Как видишь, функция [FONT=Courier New]GetExecutionContext[/FONT] не требует никаких данных, которые сообщают ей о месте её вызова.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог