class SomeClass
{
[ххх("some data")]
public object Property
{
get
{
//делаем что-то в зависимости от значения атрибута xxx
}
}
}
Контекст выполнени кода и атрибуты
Ну а вообще использовать так:
Код:
this.GetFiled("xxx").GetCustomAttributes()
Находишь нужный атрибут и в зависимости от значений там что-то делаешь. В целом конечно подход другой. Но это слишком долгая история, если что пиши в аську 580758 и я там всё объясню.
Есть ли такая возможность?
Код:
class SomeClass
{
[ххх("some data")]
public object Property
{
get
{
//тут хотелось бы узнать , что это именно свойство с именем Property
//делаем что-то в зависимости от значения атрибута xxx
}
}
}
{
[ххх("some data")]
public object Property
{
get
{
//тут хотелось бы узнать , что это именно свойство с именем Property
//делаем что-то в зависимости от значения атрибута xxx
}
}
}
Ещё раз повторюсь, практической пользы из этого извлечь не хочу, просто есть желание познать :)
Код:
[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]
[/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] не требует никаких данных, которые сообщают ей о месте её вызова.