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

Код: c#
1.
2.
3.
4.
5.
6.
[Display(Name = "Имя класса", Description = "Описание класса.")]
public class MyClass
{
	[Display(Name = "Имя свойства", Description = "Описание свойства.")]
	public int MyProperty { get; set; }
}



Хочу, чтобы доступ к значениям атрибутов был типа такого:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
string name = MyClass.Attributes.Display.Name;

MyClass myObject = new MyClass();

// далее или
string objectDescription = myObject.MyProperty.Attributes.Display.Description;

// или
string objectDescription = myObject.Attributes.MyProperty.Display.Description;



Т. е. состав коллекции Attributes должен зависеть от установленных атрибутов и значений их параметров.

Как сделать?

У меня соображение такое - для типов коллекция атрибутов должна быть статическим членом типа, а для экземпляров... не знаю какой. Для первого случае в моём коде получается какая-то обёртка над интовым свойством MyProperty, а для второго - просто коллеция Attributes, у которой атрибуты рассортированы в объекты с именами, совпадающими с именами свойств класса MyClass.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145095
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

"Как сделать... как к членам класса" - ну и сделайте "членами класса", что мешает? зачем вообще связываться с атрибутами, в чем необходимость?

ps. если бы у бабушки были яйца, она бы точно была дедушкой (с)
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145105
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRuser7320,

"Как сделать... как к членам класса" - ну и сделайте "членами класса", что мешает? зачем вообще связываться с атрибутами, в чем необходимость?

ps. если бы у бабушки были яйца, она бы точно была дедушкой (с)

Так я же объяснял (в других темах), что я не могу придумать унивресальную обёртку над интовыми (дабловыми и прочими) типами. Т. е. не могу придумать класс, который бы принимал объект любого типа и превращал бы его в объект нужного типа. Вот, пишу как члены класса, вместо атрибутов

double myValue;
string myValueName;
string myValueDescription;
double myValueMax;
double myValueMin;

Видите, жирным выделил - это у меня дабл. А я хочу, чтобы был любой тип. Мне придётся столько классов сделать, сколько типов я хочу использовать в такой конструкции. И если даже последние четыре свойства можно вынести в базовый класс, наследуемых классов всё равно будет по числу типов.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145110
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо дабла в выделенном поле должен стоять некий неопределённый тип. Тип должне определиться, когда я классу в, например, конструктор пошлю параметр (инт там, или дабл, или даже ссылочный тип). И после этого это значение уже должно во всех расчётах и в Интеллисенсе быть того типа, который я ему присвоил через параметр конструктора. Во как я хочу.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145115
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nullable<T> не подходит, потому что он либо конкретный nullable (int?, нпример), либо неопределённый Nullable<T>, который надо при использовании в расчётах постоянно приводить к нужному типу.

object - то же самое - надо приводить постоянно (распаковка для типов значений).

C dynamic, мне кажется, тоже не прокатит, т. к. разве можно интенсивно использовать эти дайнэмики в математических расчётах? Я же знать не буду, что с чем использую и что где получаю. Да и Интеллисенс работать не будет.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145119
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

Вы бы сформулировали свою задачу на каком-то конкретном примере, а то, например мне, после нескольких Ваших тем, так и не понятно чего Вы в конце концов добиваетесь...(((
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145129
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, кто-нибудь использовал dynamic в расчётах, в которых все переменные - инты, даблы, флоаты и прочие - заменены на эти дайнэмики? Ну и как, нормально получалось? Я сейчас попробовал - можно и в индексы массива дайнэмики пихать, даже не приводя к типу int. Только такие расчёты чреваты ошибками - ведь проверки на типы во время редактирования кода и компиляции нет. Т. е. мне придётся смириться с этим, чтобы осуществить то, что я хочу?
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145136
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRuser7320,

Вы бы сформулировали свою задачу на каком-то конкретном примере, а то, например мне, после нескольких Ваших тем, так и не понятно чего Вы в конце концов добиваетесь...(((

У меня простая задача и я недоумеваю, почему ни у кого ничего подобного не возникало и никто не может нормально ответить.

Задача: есть настройки в виде чисел разных типов (даблы, инты и прочие). Эти настройки сгруппированы в группы настроек. Каждая группа - отдельный тип: Settings1, Settings2 и т. д. Все группы собраны под общим типом Settings.

Далее. К каждой настройке есть такие данные: название настройки (локализованное - берётся из ресурсов), описание найстроки (тоже локализованное), максимальное и минимальное допустимые значения и другие. К каждой группе настроек тоже есть название и описание.

Вроде, всё привычно? У каждого такое было? Я бы даже сказал, почти в каждом первом стандартном проекте, да?

Я спросил (давно уже было), как это всё легче организовать. Мне сказали, что все эти свойства настроек - это метаданные этих настроек, посему их надо в атрибуты. Я так и сделал. Настройки, значит, это у меня модель. Сами значения настроек используются в расчётах в модели, а их значения устанавливаются в интерфейсе через модель представления. Свойства же настроек (названия, описания) показывются тоже в модели представления. Значения и пределы значений настроек байндятся к контролам в представлениях.

Всё просто - каждый первый случай такой, да? Я НЕ ПОНИМАЮ - разве никто с этим не сталкивался? Почему нет стандартного способа решения?
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145137
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСвойства же настроек (названия, описания) показывются тоже в модели представления
Они тоже байндятся к контролам представления, только без возможности редактирования.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145143
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итого - в модели есть атрибуты, а через модель представления в представлениях надо значения из этих атрибутов показать. Я пробовал с конвертерами - молучилось. Но слишком многословн - ближе к началу темы http://www.sql.ru/forum/actualthread.aspx?tid=1002838
и
http://www.sql.ru/forum/actualthread.aspx?tid=1000065

Потом вы уже, LR, подсказали, что проще хранить все значения атрибутов в коллекции и вызывать их своей нотацией. За что вам болшое спасибо - код упростился значительно и вся обслуга убралась в базовый класс, разгрузилась разметка.

Но и этого мне показалось мало. Почему, в конце-концов, я должен какие-то костыли придумывать?! Хочу, чтобы доступ к атрибутам был такой же удобный, как и к свойствам обычных объектов! Например, через точку.

Вот и вся история.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145149
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Мне сказали, что все эти свойства настроек - это метаданные этих настроек, посему их надо в атрибуты. Я так и сделал. Настройки, значит, это у меня модель. Сами значения настроек используются в расчётах в модели, а их значения устанавливаются в интерфейсе через модель представления.
имхо, такие "метаданные" есть ничто иное как данные, посему их не надо в атрибуты...
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145154
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь за неточность, и плохо, что здесь нельзя редактировать старые посты. Вобщем, код доступа к данным атрибутов в первом посте неправильный. На самом деле я хочу что-то типа такого:

Код: c#
1.
2.
3.
4.
5.
6.
// Get type attribute...
string className = MyClass.Attributes.Display.Name;

// Get member attribute...
string propertyDescription =
	MyClass.Properties.MyProperty.Attributes.Display.Name;



О как! Т. е. я хочу код, который автоматом заполнит статические поля-коллеции (или как там лучше организовать это) MyClass.Attributes и MyClass.Properties с нужными мне данными. При этом имена этих полей и имена вложенных в них полей, типа Display, Name и прочих, должны совпадать с составом свойств, атрибутов и свойств атрибутов для данного класса.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145156
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRuser7320Мне сказали, что все эти свойства настроек - это метаданные этих настроек, посему их надо в атрибуты. Я так и сделал. Настройки, значит, это у меня модель. Сами значения настроек используются в расчётах в модели, а их значения устанавливаются в интерфейсе через модель представления.
имхо, такие "метаданные" есть ничто иное как данные, посему их не надо в атрибуты...
Если не в атрибуты, то вариант остаётся только в класс-обёртку. Или в базовый класс. Но тогда в любом случае в классе-обёртке должно быть поле, отвечающее за хранение самого значения настройки. А проблема в том, что это значение может быть одного из нескольких типов. Т. е. придётся столько обёрток делать, сколько типов настроек я хочу хранить. Так?
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145160
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Или в базовый класс.
чем плохо в базовый класс?
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145163
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRuser7320Или в базовый класс.
чем плохо в базовый класс?
А как САМО значение настройки хранить? Вот так?


Код: 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.
public class Base
{
	string myValueName;
	string myValueDescription;
	double myValueMax;
	double myValueMin;
}

public Setting1_of_Settings1 : Base
{
	double myValue;
}

public Setting2_of_Settings1 : Base
{
	int myValue;
}

public Setting1_of_Settings2 : Base
{
	bool myValue;
}

public Settings1 : Base
{
	Setting1_of_Settings1 setting1;
	Setting2_of_Settings1 setting2;
	Setting1_of_Settings2 setting3;
}
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145164
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только настроек у меня 50 штук. 50 штук классов - лучше с атрибутами маяться тогда уж.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145165
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, кстати, базовых классов тоже надо много - там максимум и минимум должны быть того же типа, что и само значение.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145185
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

для таких случаев можно использовать дженерики
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public class Setting<T>
    {
        public T MyValue { get; set; }
        public string MyValueName { get; set; }
        public string MyValueDescription { get; set; }
        public T MyValueMax { get; set; }
        public T MyValueMin { get; set; }
    }
...
... = new Setting<double> { MyValue = 0.11, MyValueMax = double.MaxValue, MyValueName = "test 11" };
... = new Setting<int> { MyValue = 12, MyValueMin = int.MinValue, MyValueName = "test 1-2" };
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145238
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRuser7320,

для таких случаев можно использовать дженерики
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public class Setting<T>
    {
        public T MyValue { get; set; }
        public string MyValueName { get; set; }
        public string MyValueDescription { get; set; }
        public T MyValueMax { get; set; }
        public T MyValueMin { get; set; }
    }
...
... = new Setting<double> { MyValue = 0.11, MyValueMax = double.MaxValue, MyValueName = "test 11" };
... = new Setting<int> { MyValue = 12, MyValueMin = int.MinValue, MyValueName = "test 1-2" };


А как использовать это в расчётах и как повлияет это на производительность?

Например,



Код: c#
1.
2.
3.
4.
5.
Setting<int> a = new Setting<int> { MyValue = 1, MyValueMax = int.MaxValue, MyValueName = "a" };
Setting<double> b = new Setting<double> { MyValue = 0.11, MyValueMax = double.MaxValue, MyValueName = "b" };
Setting<double> c = new Setting<double> { MyValue = 0.11, MyValueMax = double.MaxValue, MyValueName = "c" };

double x = (a.MyValue / Math.PI) + b.MyValue * Math.Pow(c.MyValue) / (array[a.MyValue] - array[a.MyValue - 1]);
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145301
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял задачу топикстартера, то вот вариант решения:

Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;

namespace AttributedSettings
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("SettingsType1");
            Console.WriteLine("-------------");
            var x = new SettingsType1();
            foreach (var prop in x.GetType().GetProperties())
                foreach (var param in x.GetPropertyParameters(prop.Name))
                    Console.WriteLine("{0}.{1} = {2}", prop.Name, param, x.GetPropertyParameterValue(prop.Name, param));

            Console.WriteLine();
            Console.WriteLine("SettingsType2");
            Console.WriteLine("-------------");
            var y = new SettingsType2();
            foreach (var prop in y.GetType().GetProperties())
                foreach (var param in y.GetPropertyParameters(prop.Name))
                    Console.WriteLine("{0}.{1} = {2}", prop.Name, param, y.GetPropertyParameterValue(prop.Name, param));

            Console.ReadLine();
        }
    }
    
    public class SettingsType1 : SettingsBase
    {
        [Parameter("Name", "Test int property")]
        [Parameter("Description", "Some test property of type <int>")]
        [Parameter("DefaultValue", 100)]
        [Parameter("MinValue", 0)]
        [Parameter("MaxValue", 1000)]
        public int IntProperty { get; set; }

        [Parameter("Name", "Test string property")]
        [Parameter("DefaultValue", "Test")]
        public string StringProperty { get; set; }

        public SettingsType1()
        {
            IntProperty = 100;
            StringProperty = "Test";
        }
    }

    public class SettingsType2 : SettingsBase
    {
        [Parameter("Name", "Unique identifier")]
        [Parameter("DefaultValue", "63EFF92C-62B0-4B34-9EB7-F8303AA9B31F")]
        public Guid UID { get; set; }

        public SettingsType2()
        {
            UID = Guid.Parse("63EFF92C-62B0-4B34-9EB7-F8303AA9B31F");
        }
    }

    [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
    public class ParameterAttribute : Attribute
    {
        public string Name { get; set; }
        public object Value { get; set; }

        public ParameterAttribute(string name, object value)
        {
            Name = name;
            Value = value;
        }
    }

    public class SettingsBase
    {
        static SettingsBase()
        {
            _parameters = new Dictionary<Type, Dictionary<string, Dictionary<string, object>>>();
        }

        private static Dictionary<Type, Dictionary<string, Dictionary<string, object>>> _parameters;
        private Dictionary<Type, Dictionary<string, Dictionary<string, object>>> PropertiesParameters
        {
            get
            {
                if (!_parameters.ContainsKey(GetType()))
                {

                    var typePropertiesParameters = new Dictionary<string, Dictionary<string, object>>();

                    foreach (var property in GetType().GetProperties())
                    {
                        var attributes = property.GetCustomAttributes(typeof(ParameterAttribute), true);
                        if(attributes.Any())
                        {
                            var propertyParams = attributes.Cast<ParameterAttribute>().ToDictionary(attribute => attribute.Name, attribute => attribute.Value);
                            typePropertiesParameters.Add(property.Name, propertyParams);
                        }
                    }

                    _parameters.Add(GetType(), typePropertiesParameters);
                }

                return _parameters;
            }
        }

        public ReadOnlyCollection<string> GetPropertyParameters(string property)
        {
            if (!PropertiesParameters.ContainsKey(GetType()))
                throw new InvalidOperationException();

            if (!PropertiesParameters[GetType()].ContainsKey(property))
                throw new ArgumentException("property");

            return PropertiesParameters[GetType()][property].Keys.ToList().AsReadOnly();
        }

        public object GetPropertyParameterValue(string property, string name)
        {
            if (!PropertiesParameters.ContainsKey(GetType()))
                throw new InvalidOperationException();

            if (!PropertiesParameters[GetType()].ContainsKey(property))
                throw new ArgumentException("property");

            var propertyParams = PropertiesParameters[GetType()][property];

            if(!propertyParams.ContainsKey(name))
                throw new ArgumentException(null, "name");

            return propertyParams[name];
        }
    }
}


...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145429
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Например,
ну и что?
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145469
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRuser7320Например,
ну и что?
Это как минимум многословно и неудобно набирать. По мне, так при расчётах, когда уже прошли все валидации, лучше создать иерархию подклассов без этой обвески в виде доп. параметров - оставить только значения. И с ними уже считать. Чтобы вместо Object.Subobject.Subobject.a было просто а. Но тогда уже с обвеской что мы имеем: сначала загоняем в обвеску - куча кода, а потом выводим из неё - куча кода. Получается, что кода не меньше, чем при атрибутах или конвертерах.

Меня атрибуты устраивали - удобный и компактный способ "приписать" данные к данным. Меня только не устраивает, как муторно к ним иметь доступ. Почему создатели фреймворка до сих пор не придумали удобный способ? И чтобы привязки работали. Вобщем, проблема только в том, что приходится самому кодить код-обслугу для такого доступа. И самодельный доступ получается какой-то "не нативный", а костыльный. А так я в атрибутах ничего плохого не вижу.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145470
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, непонятно, зачем помещать что-то в атрибуты, если достать что-то оттуда и привязаться к этому - лучше убиться?
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145528
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320удобный и компактный способ "приписать" данные к данным.
исполизуй короткий термин - метаданные
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145557
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Проблема" надумана и высосана из пальца.

.NET дает возможность использовать атрибуты, есть варианты:
использовать их

не использовать их
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145816
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Например, есть класс с атрибутами

Код: c#
1.
2.
3.
4.
5.
6.
[Display(Name = "Имя класса", Description = "Описание класса.")]
public class MyClass
{
	[Display(Name = "Имя свойства", Description = "Описание свойства.")]
	public int MyProperty { get; set; }
}




Хочу, чтобы доступ к значениям атрибутов был типа такого:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
string name = MyClass.Attributes.Display.Name;

MyClass myObject = new MyClass();

// далее или
string objectDescription = myObject.MyProperty.Attributes.Display.Description;

// или
string objectDescription = myObject.Attributes.MyProperty.Display.Description;




Т. е. состав коллекции Attributes должен зависеть от установленных атрибутов и значений их параметров.

Как сделать?

У меня соображение такое - для типов коллекция атрибутов должна быть статическим членом типа, а для экземпляров... не знаю какой. Для первого случае в моём коде получается какая-то обёртка над интовым свойством MyProperty, а для второго - просто коллеция Attributes, у которой атрибуты рассортированы в объекты с именами, совпадающими с именами свойств класса MyClass.

вы не совсем (или скорее всего совсем НЕ ) разобрались что вам нужно.
Метаданные нужны для кого, что бы получить информацию о классе в рантайме, при том что в дизайнтайме она неизвестна. Вы же зная все о классе в дизайнтайме зачем-то мутитесь с аттрибутами


МСУ"Проблема" надумана и высосана из пальца.

.NET дает возможность использовать атрибуты, есть варианты:
использовать их

не использовать их


совершенно согласен
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145824
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationрантайм / дизайнтайм
Чётко подмечено, +1
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145838
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationМетаданные нужны для кого, что бы получить информацию о классе в рантайме, при том что в дизайнтайме она неизвестна.Дизайнер умеет "лазить" в скомпилированные сборки текущего проекта.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145857
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ"Проблема" надумана и высосана из пальца.

.NET дает возможность использовать атрибуты, есть варианты:
использовать их

не использовать их

Т. е. вы согласны, что в Дотнете возможность устанавливать значения атрибутов реализована легко и удобно, а возможность считывать эти значения - трудно и неудобно?
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145873
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320 ???
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145879
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КpationМетаданные нужны для кого, что бы получить информацию о классе в рантайме, при том что в дизайнтайме она неизвестна.Дизайнер умеет "лазить" в скомпилированные сборки текущего проекта.
Я знаю - потому что я и дизайнер, и программист. А так я хотел вытащить данные из атрибутов модели в обычные данные модели представления. Столкнулся со сложностями - просто так фиг достанешь их. Точнее, достать-то можно, только хранить как и где, чтобы много кода не писать. Мне тут подсказали всякие штуки с дженериками - я пока их на уровне модели представления ещё не пробовал.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145883
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кuser7320 ???
Ну так там писать чего-то надо, чтобы вытащить значения, а чтобы их туда (в атрибуты) поместить, почти ничего писать не надо - квадратную скобку открыл, слово написал и давай значения забивать. Вот бы так и получать эти значения!
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145890
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Алексей Кпропущено...
Дизайнер умеет "лазить" в скомпилированные сборки текущего проекта.
Я знаю - потому что я и дизайнер, и программист.Имеется в виду не человек, а редактор форм в Visual Studio.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145892
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Т. е. вы согласны, что в Дотнете возможность устанавливать значения атрибутов реализована легко и удобно, а возможность считывать эти значения - трудно и неудобно?
я, например, несогласен
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145898
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилuser7320Т. е. вы согласны, что в Дотнете возможность устанавливать значения атрибутов реализована легко и удобно, а возможность считывать эти значения - трудно и неудобно?
я, например, несогласен Это должно решаться голосованием...
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145915
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Ну так там писать чего-то надо, чтобы вытащить значения, а чтобы их туда (в атрибуты) поместить, почти ничего писать не надо - квадратную скобку открыл, слово написал и давай значения забивать. Вот бы так и получать эти значения!Что мешает вбить название поля сразу в XAML? Часто одного названия поля недостаточно. Оно может отличаться, если поле расположено в таблице, на форме редактирования, в детализации объекта и т. п.

"Овчинка выделки не стоит" (с)
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145922
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320МСУ"Проблема" надумана и высосана из пальца.

.NET дает возможность использовать атрибуты, есть варианты:
использовать их

не использовать их

Т. е. вы согласны, что в Дотнете возможность устанавливать значения атрибутов реализована легко и удобно, а возможность считывать эти значения - трудно и неудобно?
И то и другое удобно и не вызывает никаких трудностей.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145924
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЧто мешает вбить название поля сразу в XAML?
Мешает его отсутствие. Вот у меня, к примеру, есть aspx, ascx, schtml. А xaml нету, в чем я не прав?
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38145928
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЧто мешает вбить название поля сразу в XAML?
Мешает его отсутствие. Вот у меня, к примеру, есть aspx, ascx, schtml. А xaml нету, в чем я не прав? "У всех свои недостатки" (с)
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38146314
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилuser7320Т. е. вы согласны, что в Дотнете возможность устанавливать значения атрибутов реализована легко и удобно, а возможность считывать эти значения - трудно и неудобно?
я, например, несогласен
МСУuser7320пропущено...

Т. е. вы согласны, что в Дотнете возможность устанавливать значения атрибутов реализована легко и удобно, а возможность считывать эти значения - трудно и неудобно?
И то и другое удобно и не вызывает никаких трудностей.

Вот я устанавливаю значения атрибута:

Код: c#
1.
2.
3.
4.
5.
public class MyClass
{
	[Display(Name = "Имя свойства", Description = "Описание свойства.")]
	public int MyProperty { get; set; }
}



Как видите, я делаю это в одну строчку за - сколько там? - скажем, 60 символов. Вы сможете за 60 символов достать эти два свойства? Нет, вы будете писать рефлексивный код вида

Код: c#
1.
string s = Type.GetProperty(propName).GetCustomAttributes(bool, attrType).GetType().GetProperty(attrPropName).Name;



и это только для одного свойства одного атрибута.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38146320
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь представьте, что вместо геттеров и сеттеров в классах вы бы писали все эти бесконечные GetProperty(string propertyName). Почему доступ к метаданным реализован не также удобно, как к данным объектов - через точку или там индекс?
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38146327
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Написать класс-хелпер с расширяющими методами под Ваши типовые задачи с атрибутами?
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38146389
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Теперь представьте, что вместо геттеров и сеттеров в классах вы бы писали все эти бесконечные GetProperty(string propertyName). Почему доступ к метаданным реализован не также удобно, как к данным объектов - через точку или там индекс?
Вы никуя не поняли
атрибуты в dotNet реализованы так, как должны быть реализованы,
вы же пытаетесь повесить на них функциональность статических свойств

читать вышенаписанное 10 раз перез сном, до полного просветления
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38146486
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кuser7320Написать класс-хелпер с расширяющими методами под Ваши типовые задачи с атрибутами?
Я вот, когда атрибуты задавал, ничего не писал расширяющего. А чтобы достать - расширять надо? - Фи.

pationuser7320Теперь представьте, что вместо геттеров и сеттеров в классах вы бы писали все эти бесконечные GetProperty(string propertyName). Почему доступ к метаданным реализован не также удобно, как к данным объектов - через точку или там индекс?
Вы никуя не поняли
атрибуты в dotNet реализованы так, как должны быть реализованы,
вы же пытаетесь повесить на них функциональность статических свойств

читать вышенаписанное 10 раз перез сном, до полного просветления
Да, хочу. Мне нужно к цифирям (инты там, даблы) приделать свойства (максимумы там, минимумы и прочие). А чтобы эти цифири остались цифирями и их было удобно использовать в расчётах (чтобы не писать как тут http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1003579&msg=13905106 ), я приделал к ним атрибуты, которые как бы не видно (а, значит, они не мешают), пока просто в расчётах используешь, но когда надо, я хочу быстро и удобно их получить - без всяких расширяющих и прочих конвертеров, а то я и сам могу понаписать... целый фреймворк могу понаписать, да.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38146526
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Алексей Кпропущено...
Написать класс-хелпер с расширяющими методами под Ваши типовые задачи с атрибутами?
Я вот, когда атрибуты задавал, ничего не писал расширяющего. А чтобы достать - расширять надо? - Фи.Обиделся?
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38146543
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Как видите, я делаю это в одну строчку за - сколько там? - скажем, 60 символов. Вы сможете за 60 символов достать эти два свойства? Нет, вы будете писать рефлексивный код вида
И что дальше-то? Бери и проверяй рефилексией все свойства.
Код: c#
1.
IList<CustomAttributeData> data = typeof(Item).GetCustomAttributesData();


"Движок" пишется один раз (в виде хелпера или в виде расширения) и используется в программе по недобности.

С одной стороны ты хочешь динамику, причем с сотней различных по типу атрибутов. С другой стороны ты орёшь, что неудобно работать с такой разносолой динамикой. Извини, .NET не умеет гадать на кофе.

Ты определись с задачей, что конкретно (!) нужно для задачи, скорей всего у тебя с архитектурой затык. А то ты так неумело пытаешься понапридумывать всего и чтоб оно всё гладко решалось одной строчкой кода.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38146544
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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();
    }
}
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38146585
Ermak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так полагаю, что следующим топиком от user7320 будет вопрос про динамическое изменение значений атрибутов во время исполнения программы.

PS. Вдруг локализация понадобится, а тут же все на атрибутах завязано.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38146837
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ИМХО - попытки написать что-то универсальное, на все случаи жизни - детская болезнь в программизьме
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #38146854
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2, "имхо" можно смело вычеркивать.
...
Рейтинг: 0 / 0
Как сделать, чтобы доступ к атрибутам был как к членам класса?
    #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
63 сообщений из 63, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сделать, чтобы доступ к атрибутам был как к членам класса?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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