powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сделать, чтобы доступ к атрибутам был как к членам класса?
13 сообщений из 63, страница 3 из 3
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38147095
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУuser7320Как видите, я делаю это в одну строчку за - сколько там? - скажем, 60 символов. Вы сможете за 60 символов достать эти два свойства? Нет, вы будете писать рефлексивный код вида
И что дальше-то? Бери и проверяй рефилексией все свойства.

"Движок" пишется один раз (в виде хелпера или в виде расширения) и используется в программе по недобности.
Но у них же есть готовый "движок" для задания атрибутов, для свойств и прочих плюшек - почему нет готового для считывания значений с атрибутов? Почему я не могу поставить точку, выбрать коллекцию "Атрибуты" и выбрать один из заданных атрибутов, а потом одно из его свойств? Почему я должен сам это писать, да и, как тут некоторые говорят, без кодогенерации (всякие Т4) это может и не получиться? Т. е. задать атрибуты - дело новичка и студента, а считать - дело профи и всяких мастеров кодогенерации.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38147096
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кuser7320целый фреймворк могу понаписать, да.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public static class ЛютыйФреймворк
{
    public static T GetAttribute<T>(this Type type, string propertyName)
        where T : Attribute
    {
        return type.GetProperty(propertyName)
            .GetCustomAttributes(typeof(T))
            .Cast<T>()
            .First();
    }
}


Вы мне тут не это... Полный код (в виде конвертера, но это неважно - функция, она и в Африке функция) выглядит так (без всяких проверок на наллы и прочих исключений):

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
	// MetadataParameters содержит данные об именах свойств и типах.
	var mp = parameter as MetadataParameters;

	var modelPropertyInfo = mp.ModelType.GetProperty(mp.ModelProperty);
	if (modelPropertyInfo == null)
		return null;

	var attribute = modelPropertyInfo
		.GetCustomAttributes(true)
		.Cast<Attribute>()
		.FirstOrDefault(memberInfo => memberInfo.GetType() == mp.AttributeType);
	if (attribute == null)
		return null;

	var attributePropertyInfo = attribute.GetType().GetProperty(mp.AttributeProperty);
	if (attributePropertyInfo == null)
		return null;

	CultureInfo ci = Thread.CurrentThread.CurrentUICulture;

	var attributePropertyValue = attributePropertyInfo.GetValue(
		attribute,
		System.Reflection.BindingFlags.Default,
		null,
		new object[] { },
		ci);

	return attributePropertyValue;
}
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38147098
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверки на наллы всё же оставил, хотя не все - при использовании as тоже надо проверку делать. Плюс ещё мог что-то упустить. В любом случае, то, что написал Алексей К. - только часть.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38147100
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я этот конвертер использовал в замле, который многословен как XML, поэтому разметка захламлялась. Пришлось отказаться. В принципе, этот же код надо куда-нибудь в более удобное... расширение или ещё чего там запихать. Чтобы в том же замле, скажем, можно было через точку делать доступ. Да я и написал по подсказке - индексируемые свойства в модели представления, которые позволяют, через точку указывая названия атрибута и имена свойств, получать нужное значение. Другое дело, что тут нет Интеллисенса (он вообще и в замле-то плохо работает, стоит углубиться куда-нибудь в байндинги) и придумана своя нотация, да плюс костыли - эти "указывать через точку" на самом деле строка-ключ словаря, так что никакого рефакторинга нормально не провернёшь. Но замл, похоже, вообще на автоматический рефакторинг (в отличие от C# кода, где какая-то утилитка предлагает заменить все упоминания названия изменённой переменной) не рассчитан. Тоже мне не очень нравится, но хоть что-то.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38147102
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, а должно всё через точку или как там вызываться - т. е. за меня кто-то должен нагенерировать для каждого объекта, для которого установлены атрибуты, коллеции этих установленных атрибутов и их свойств (свойств атрибутов, блин!). Т. е. чтобы Интеллисенс работал и изменения названий и всех упоминаний свойств и атрибутов делались парой кликов мышки там - ну, как для "обычного" кода всё сделано.

Я что, многого прошу? Просто хочу, чтобы было НОРМАЛЬНО. Вот. Да.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38147207
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Но у них же есть готовый "движок" для задания атрибутов, для свойств и прочих плюшек - почему нет готового для считывания значений с атрибутов?
Почему нету, а GetCustomAttributes чем не устраивает? Тебе за минуту был написал класс "ЛютыйФреймворк" с нужным расширением, бери и юзай.

user7320Почему я не могу поставить точку, выбрать коллекцию "Атрибуты" и выбрать один из заданных атрибутов, а потом одно из его свойств?
Наверное потому, что фреймворк писался не только для тебя.

user7320Почему я должен сам это писать
Потому что программист должен писать код, так обычно принято.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38147242
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Да, я этот конвертер использовал в замле, который многословен как XML, поэтому разметка захламлялась. Пришлось отказаться.Пора уже определиться, к чему эти претензии. К System.Reflection или к WPF ? Рефлекшен, это вещь довольно фундаментальная. Она не обязана быть заточена чисто под WPF. Да и появился рефлекшен гораздо раньше.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38147247
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку: если продолжать в том же ключе, можно дойти и до требований поддержки INotifyPropertyChanged , DependencyProperty и т. п. на уровне базового супертипа Object .
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38147250
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравнивать рефлексию с впф - это как как сравнивать почтового голубя с мылом

Гулька

Не нагибаться


Впринципе, сходств не мало. Но и не сказать, что прям-таки одно и тоже.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38147256
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Вы мне тут не это... Полный код (в виде конвертера, но это неважно - функция, она и в Африке функция) выглядит так (без всяких проверок на наллы и прочих исключений)
Повторюсь, про расширение разметки. Мне кажется, что такая постановка задачи будет более удобна:
Код: xml
1.
2.
3.
4.
<StackPanel Orientation="Horizontal">
    <TextBlock Text="{my:PropertyDescriptionMetadata {x:Type my:MyType}, MyProperty}"/>
    <TextBox Text="{Binding MyProperty}"/>
</StackPanel>
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38147401
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кuser7320Вы мне тут не это... Полный код (в виде конвертера, но это неважно - функция, она и в Африке функция) выглядит так (без всяких проверок на наллы и прочих исключений)
Повторюсь, про расширение разметки. Мне кажется, что такая постановка задачи будет более удобна:
Код: xml
1.
2.
3.
4.
<StackPanel Orientation="Horizontal">
    <TextBlock Text="{my:PropertyDescriptionMetadata {x:Type my:MyType}, MyProperty}"/>
    <TextBox Text="{Binding MyProperty}"/>
</StackPanel>


Штука в том, что атрибуты не в модели представления, а в модели. Т. е. вот так взять и напрямую указать атрибуты модели представления нельзя, т. к. их нет. Поэтому я и делал через конвертер, т. к. конвертер - часть модели представления и имеет доступ к модели. Поэтому приходилось в параметр конвертера передавать составной объект, содержащий в себе тип модели, имя свойства модели, тип атрибута, имя свойства атрибута. Ну, в вашем расширении, наверное, примерно то же будет (только четыре раза надо будет указать - четыре параметра же), если это расширение будет иметь доступ к модели.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38147412
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Ну, в вашем расширении, наверное, примерно то же будет (только четыре раза надо будет указать - четыре параметра же), если это расширение будет иметь доступ к модели.
Только как же это муторно будет - мало того, что четыре параметра надо указать, так ещё для каждого параметра идентификатор (для типа это Type), а ещё для каждого идентификатора и параметра - пространство имён замл. В результате получится всего лишь раза так в два меньше, чем через конвертеры. Через конвертеры вот так


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<TextBlock 
  <TextBlock.Text>
    <Binding
      Mode="OneWay"
      Converter="{StaticResource metadataConverter}">
      <Binding.ConverterParameter>
        <Converters:MetadataParameters
          ModelType="{x:Type SettingsModels:Common}"
          ModelProperty="ExceedThreshold"
          AttributeType="{x:Type Attributes:NameDescriptionAttribute}"
          AttributeProperty="Name" />                            
      </Binding.ConverterParameter>
    </Binding>
  </TextBlock.Text>
</TextBlock>
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38147429
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Алексей Кпропущено...

Повторюсь, про расширение разметки. Мне кажется, что такая постановка задачи будет более удобна:
Код: xml
1.
2.
3.
4.
<StackPanel Orientation="Horizontal">
    <TextBlock Text="{my:PropertyDescriptionMetadata {x:Type my:MyType}, MyProperty}"/>
    <TextBox Text="{Binding MyProperty}"/>
</StackPanel>


Штука в том, что атрибуты не в модели представления, а в модели. Т. е. вот так взять и напрямую указать атрибуты модели представления нельзя, т. к. их нет. Поэтому я и делал через конвертер, т. к. конвертер - часть модели представления и имеет доступ к модели. Поэтому приходилось в параметр конвертера передавать составной объект, содержащий в себе тип модели, имя свойства модели, тип атрибута, имя свойства атрибута. Ну, в вашем расширении, наверное, примерно то же будет (только четыре раза надо будет указать - четыре параметра же), если это расширение будет иметь доступ к модели.
Штука в том, что расширение разметки PropertyDescriptionMetadataExtension может брать метаданные откуда угодно: из атрибутов, из БД, из XML файла или ещё откуда. Для этого ему даже необязательно иметь ссылку на ViewModel, в приведённом примере её и нет.

Ты зациклился на своём решении. Попробуй посмотреть на задачу свежим взглядом.
...
Рейтинг: 0 / 0
13 сообщений из 63, страница 3 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сделать, чтобы доступ к атрибутам был как к членам класса?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]