Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
.NET 4.x

Как получить свойство класса?

13.06.2017, 22:23. Показов 6615. Ответов 101
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В продолжении темы визитора Есть, к примеру, вот такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public interface IAnimals 
{
   string Name { get; set; } 
}
 
public class Dog : IAnimals
{
    public string Name { get; set; }
    public bool Ears { get; set; } = true;
}
 
public class Cat : IAnimals
{
    public string Name { get; set; }
    public bool Tail { get; set; } = false;
}
public class Squirel: IAnimals
{
    public string Name { get; set; }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var secondAnimal = new List<IAnimals>(){new Cat(), new Dog(), new Squirel()};
 
bool haveTail;
foreach (IAnimals currentAnimal in secondAnimal)
{
    if (currentAnimal is Cat)
    {
      haveTail = (currentAnimal as Cat).Tail;
      break;
    }
    if (currentAnimal is Dog)
    {
      (currentAnimal as Dog).Ears = true;
    }
}
Как нужно реализовать код, чтобы не использовать приведение типов при получении и установке значения свойства?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.06.2017, 22:23
Ответы с готовыми решениями:

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

Как поместить свойство класса типа Enum в конструктор
Привет, создал интерфейс: interface IPerson { string Firstname { get; } string Lastname { get; } ...

Можно ли как-то получить из одного класса исходный код другого класса?
Предположим есть два публичных класса. Один находится в одной части проекта, другой где-нибудь в другой части проекта. Мне для своих...

101
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
13.06.2017, 23:01
Лучший ответ Сообщение было отмечено skilllab как решение

Решение

skilllab, Если вопрос только в том, как прикрутить визитор, то вот так:
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
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication221
{
    class Program
    {
        static volatile int counter;
 
        static void Main(string[] args)
        {
            var animals= new List<Animal>() { new Cat(), new Dog(), new Squirel() };
 
            var visitor = new Visitor();
 
            foreach (Animal animal in animals)
            {
                animal.Apply(visitor);
                if (visitor.Break) break;
            }
 
            Console.WriteLine(visitor.HaveTail);
            Console.ReadLine();
        }
    }
 
    public class Visitor
    {
        public bool HaveTail { get;set;}
        public bool Break { get; set; }
 
        public void Apply(Dog animal)
        {
            animal.Ears = true;
        }
 
        public void Apply(Cat animal)
        {
            HaveTail = animal.Tail;
            Break = true;
        }
 
        public void Apply(Squirel animal)
        {
        }
    }
 
    public abstract class Animal
    {
        public string Name { get; set; }
        public abstract void Apply(Visitor visitor);
    }
 
    public class Dog : Animal
    {
        public bool Ears { get; set; } = true;
 
        public override void Apply(Visitor visitor)
        {
            visitor.Apply(this);
        }
    }
 
    public class Cat : Animal
    {
        public bool Tail { get; set; } = false;
 
        public override void Apply(Visitor visitor)
        {
            visitor.Apply(this);
        }
    }
 
    public class Squirel : Animal
    {
        public override void Apply(Visitor visitor)
        {
            visitor.Apply(this);
        }
    }
}
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
13.06.2017, 23:21  [ТС]
Storm23, это тогда получается, что если вдруг добавляется свойство в класс (не в интерфейс), то мне это свойство и в классе визитора описывать? Т.е. в визиторе должны быть все свойства, которые НЕ описаны в интерфейсе? Ну, специфичные для классов.
Т.е.
C#
1
Console.WriteLine(visitor.HaveEars);
будет

C#
1
2
3
4
5
public bool HaveEars{ get;set;}
public void Apply(Dog animal)
{
   HaveEars= animal.Ears;
}
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
14.06.2017, 00:15
Цитата Сообщение от skilllab Посмотреть сообщение
это тогда получается, что если вдруг добавляется свойство в класс (не в интерфейс), то мне это свойство и в классе визитора описывать?
Да, нужно описывать.
Ну по другому и быть не может. Вы же сами ставите задачу: получить свойства. Естественно, где-то должен быть код который будет это свойство получать и хранить.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
14.06.2017, 07:49  [ТС]
Storm23, кстати, а почему именно
Цитата Сообщение от Storm23 Посмотреть сообщение
public abstract class Animal
а не интерфейс?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
14.06.2017, 09:01
Лучший ответ Сообщение было отмечено skilllab как решение

Решение

Цитата Сообщение от skilllab Посмотреть сообщение
а не интерфейс?
потому что:
1) Семантически все классы являются животными, а значит логично наследовать от Animal. Интерфейсы же применяются для описания того, что класс поддерживает определенную функциональность.
2) Мне влом реализовывать одно и то же свойство Name 100500 раз в каждом классе.
3) Не нужно плодить интерфейсы на каждый чих. Будьте проще. Понадобятся интерфейсы - сделаете через интерфейс. Пока в вашем коде я не вижу надобности в интерфейсах. Это же касается и класса Visitor.
1
Эксперт .NET
 Аватар для Usaga
14314 / 9398 / 1355
Регистрация: 21.01.2016
Сообщений: 35,431
14.06.2017, 11:05
Цитата Сообщение от skilllab Посмотреть сообщение
это тогда получается, что если вдруг добавляется свойство в класс (не в интерфейс), то мне это свойство и в классе визитора описывать? Т.е. в визиторе должны быть все свойства, которые НЕ описаны в интерфейсе?
Что-то не очень понятно это всё. Визитёр содержит логику работы с конкретными типами объектов. Для чего в них понадобилось свойства этих объектов описывать?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
14.06.2017, 11:12  [ТС]
Usaga, так в первом же сообщении вопрос:
C#
1
haveTail = (currentAnimal as Cat).Tail;
как такое реализуется визитёром?
0
Эксперт .NET
 Аватар для Usaga
14314 / 9398 / 1355
Регистрация: 21.01.2016
Сообщений: 35,431
14.06.2017, 11:13
skilllab, вам же уже раз пять или шесть было показано КАК.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
14.06.2017, 11:28  [ТС]
Usaga, ну да, выше и показано. Тогда что именно вы спрашиваете?

Добавлено через 4 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
было показано КАК
ага, было показано как пробежаться по листу и установить свойство в классе. Чего ж непонятного.

Не по теме:

Всего лишь как установить свойство (не общее для всех классов) в конкретном одном классе (найденном к примеру по свойству "Имя") при этой пробежке если классов Dog штук 100, + классов Cat кучка + классов Cow штук 10

0
Эксперт .NET
 Аватар для Usaga
14314 / 9398 / 1355
Регистрация: 21.01.2016
Сообщений: 35,431
14.06.2017, 11:42
skilllab, у вас в визитёр передаётся ссылка на текущий класс (Dog, Cow или Cat). Соответственно, визитёр имеет полный доступ к открытым полям\свойствам\методам данного класса. В таком методе вы вольны делать всё что захотите.

Цитата Сообщение от skilllab Посмотреть сообщение
ага, было показано как пробежаться по листу и установить свойство в классе. Чего ж непонятного.
Было показано, как пробежаться по списку и определить реальный тип каждого класса с одновременной передачей ссылки на него в визитёр. Всё. Визитёр на руках имеет ссылки на все нужные ему типы классов. Что вам ещё нужно-то?

Цитата Сообщение от skilllab Посмотреть сообщение
при этой пробежке если классов Dog штук 100, + классов Cat кучка + классов Cow штук 10
Вы уже не первый раз про количество элементов в списке заикаетесь. Вы как-то что-то противопоставляете паттерну визитёр, мол другими способами коллекцию перебирать не надо?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
14.06.2017, 12:06  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Всё. Визитёр на руках имеет ссылки на все нужные ему типы классов.
Цитата Сообщение от Storm23 Посмотреть сообщение
Да, нужно описывать.
Ну по другому и быть не может.
Я ж написал - это теперь понятно.
Цитата Сообщение от Usaga Посмотреть сообщение
Вы как-то что-то противопоставляете паттерну визитёр
Нет, я пытаюсь его прикрутить к тому что у меня в голове (оно же в первом сообщении). Т.е. просто гугло_шаблонные коды не могу понять как прикручивать.
Цитата Сообщение от Usaga Посмотреть сообщение
Соответственно, визитёр имеет полный доступ к открытым полям\свойствам\методам данного класса
Т.е. пробежкой делаем
C#
1
Visit("Бобик", имя_свойства, значение_свойства)
. Заходим в визитёр. Узнаём равно ли свойство Name класса Dog "Бобику", если равно, то берём его свойство имя_свойства и устанавливаем значение как значение_свойства.
В случае возврата значения, делаем
C#
1
var someProp = currentClass.HaveEars("Бобик", имя_свойства);
Что конкретно я опять не понял? Я серьезно.

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
не первый раз про количество элементов в списке заикаетесь
Это я к тому, что Dog-ов много, а свойство нужно вытянуть у конкретного из многих. Конкретность определяется к примеру уникальным Name.
0
Эксперт .NET
 Аватар для Usaga
14314 / 9398 / 1355
Регистрация: 21.01.2016
Сообщений: 35,431
14.06.2017, 12:13
skilllab, в визит не нужно ничего передавать, кроме ссылки на сам объект. Вся логика должна крыться в методе, который будет перевызван. Если всё сложно, то такую логику можно поместить в отдельный класс визитёра.

Цитата Сообщение от skilllab Посмотреть сообщение
Это я к тому, что Dog-ов много, а свойство нужно вытянуть у конкретного из многих. Конкретность определяется к примеру уникальным Name.
Опять же, всё это должно происходить внутри метода визитёра. С вас только вызывать Accept, да смотреть не вернёт ли он true (к примеру, если вам нужен только один "Бобик").
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
15.06.2017, 00:34  [ТС]
Насколько такая конструкция будет быдлокод?
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
public class Visitor
    {
        public dynamic GetPropValue { get; set; }
        public void Apply(Dog animal)
        {
        }
 
        public void Apply(Dog animal, string prpName)
        {
        }
 
        public void Apply(Cat animal)
        {
           
        }
 
        public void Apply(Cat animal, string prpName)
        {
            PropertyInfo propInfo = typeof(Cat).GetProperty(prpName);
            GetPropValue = propInfo.GetValue(animal, null);
        }
 
        public void Apply(Squirel animal)
        {
        }
 
        public void Apply(Squirel animal, string prpName)
        {
        }
    }
 
    public abstract class Animal
    {
        public string Name { get; set; }
        public abstract void Apply(Visitor visitor);
        public abstract void Apply(Visitor visitor, string prpName);
 
    }
 
    public class Dog : Animal
    {
        public Dog(string _name)
        {
            Name = _name;
        }
 
        public bool Ears { get; set; } = true;
 
        public override void Apply(Visitor visitor)
        {
            visitor.Apply(this);
        }
 
        public override void Apply(Visitor visitor, string prpName)
        {
            visitor.Apply(this, prpName);
        }
 
    }
 
    public class Cat : Animal
    {
        public Cat(string _name)
        {
            Name = _name;
        }
 
        public bool Tail { get; set; } = false;
 
        public override void Apply(Visitor visitor)
        {
            visitor.Apply(this);
        }
 
        public override void Apply(Visitor visitor, string prpName)
        {
            visitor.Apply(this, prpName);
        }
 
   }
 
    public class Squirel : Animal
    {
        public Squirel(string _name)
        {
            Name = _name;
        }
        public override void Apply(Visitor visitor)
        {
            visitor.Apply(this);
        }
 
 
        public override void Apply(Visitor visitor, string prpName)
        {
            visitor.Apply(this, prpName);
        }
 
    }
 
class Program
    {
        static void Main(string[] args)
        {
            string catName = "Барсик";
            var animals = new List<Animal>() {new Cat(catName), new Cat("Кузя"), new Dog(""), new Squirel("")};
 
            var visitor = new Visitor();
 
            foreach (Animal animal in animals)
            {
                if (animal.Name == catName)
                {
 
                    animal.Apply(visitor, nameof(Cat.Tail));
                    var ee = visitor.GetPropValue;
                }
                Console.ReadLine();
            }
        }
    }
0
Эксперт .NET
 Аватар для Usaga
14314 / 9398 / 1355
Регистрация: 21.01.2016
Сообщений: 35,431
15.06.2017, 04:43
skilllab, это трындец, а не быдлокод. По сравнению с этим, решение использовать IS - верх производительности и элегантности. Тут смешано всё самое плохое: многословность визитёра и рефлексия. Кода много и он медленный.

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

Неужели вы вообще не думаете, что пишете? Если так, то пишите любой тяп-ляп, лишь бы он был короткий и ясный был, остальное для вас просто не важно.

Ну уточнения по говнокоду:

* визитёр - это роль класса, называть его так не нужно;
* методы в визитёре, как правило, отражают имя класса, который они принимаю: VisitDog, VisitCat, VisitCow;
* метод визитёра может принимать нужный тип объекта;
* визитёра, как гостя, принимают (Accept), а не применяют как вещь (Apply);
* методы визитёра принимают только ссылку на объект, никаких других параметров там не должно быть;
* визитёр заключает в себе логику обработки, это - не тупо набор методов для кривого перевызова извне. Это - самостоятельная логическая единица. Если вариантов алгоритмов обработки одного и того же типа может быть несколько, то создавайте несколько же разных визитёров.

Рекомендую пересмотреть прошлую тему с четырьмя примерам визитёра. Вы их, видимо, не заметили. Во всех примера всё было просто и понятно. Для меня остаётся загадкой, почему вам так сложно понять, что в визитёр нужно вынести не отдельные строчки кода из блока IF (anima is Dog) {}, в вообще всё, так, что бы из call site вам нужно было просто вызвать визитёра и всё. Максимум - при создании класса визитёра ему передать параметры какие-то, если нужно.

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

Вас никто никуда не гонит (я так думаю). Сядьте спокойно и разберите примеры (в том числе и из википедии или гугла), строчка за строчкой, вдумчиво. Если что-то непонятно - погуглите и ещё раз подумайте. Потом спросите, но сначала подумав.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
15.06.2017, 08:19  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
что бы избавиться от необходимости рыться в метаданных
ну да, тупанул))


1)
Цитата Сообщение от Usaga Посмотреть сообщение
методы визитёра принимают только ссылку на объект, никаких других параметров там не должно быть;
согласно не менее опытному коллеге
Цитата Сообщение от Psilon Посмотреть сообщение
class ConditionalChangerVisitor
{
* *public void Visit(string name, Rabbit rabbit)
* *{
* * * if (rabbit.Name == name)
* * * * *rabbit.Claws.Sharp = false;
* *}
}
и Сразу ниже
Цитата Сообщение от Usaga Посмотреть сообщение
Максимум - при создании класса визитёра ему передать параметры какие-то, если нужно.
-------------------
Я тоже устал объяснять вам аж в двух разных темах что мне нужно. И кодом показывал, и словами, и блин даже кусок своего кода выложил - вам всё ни по чём. Точнее, вы не понимая сути моего вопроса сыплете шаблоном визитёра из гугла.
Сколько раз можно мне писать)) с помощью визитера:
- мне НЕ надо устанавливать свойство во всех классах коллекции и НЕ надо что-то там вычислять в классах
- мне НЕ надо обрабатывать никакую логику ни над конкретным классом который визится в данный момент при переборе, ни в каких либо других классах при переборе и Visit() на них
- мне НЕ надо реализовывать в какую-то "самостоятельную логическую единицу" в визитере
- "да смотреть не вернёт ли он true" Мне НЕ надо возвращать true из визитера. Исключение:
break; показанный Storm23.

Мне нужно всего лишь избавиться от каста для получения значения свойства, или установки оного, одного единственного уникального класса из коллекции с этими классами. Или вообще без всякого перебора просто получить значение свойства, или установить значение свойства, класса имея лишь его интерфейс. Всё. Это жуётся вот уже 2 темы. Именно жуётся вами. Форум то на то и существует, чтоб помогать или спрашивать. Пространные ответы посыла в гугл на конкретный вопрос или ответы в стиле "всё не то, переделывай" без объяснения как НАДО переделать - оно вам нравится что-ли?
Psilon с ходу понял что нужно сделать с визитёром чтоб установить свойство, а вы всё пишете про шаблонный перебор коллекции.

Цитата Сообщение от Usaga Посмотреть сообщение
Ну уточнения по говнокоду:
Круто, конечно, но это ни разу не ответ по теме. Это размазывание и уход.

Знаете, я кажется понял. У вас ответы в стиле "увидел нужное слово в сообщении - ответил в нужном русле, но исходя из своих соображений"

чуток сарказма))

Не по теме:


Я: как звали Пушкина?
Некий_никнейм: Вам нужно правильно обратиться к методу Name, для этого вам надо вызвать "то-то" и "то-то". Правильно будет обращаться через свойство методом, при этом возвратив true если Name совпало. Есть шаблон для таких случаев NameVisitor. Кароч погуглите. Задавайте конкретные вопросы.
....
любой_другой_никнейм: Александр.

0
Эксперт .NET
 Аватар для Usaga
14314 / 9398 / 1355
Регистрация: 21.01.2016
Сообщений: 35,431
15.06.2017, 08:30
skilllab, ну ок. Значит ваша задача существенно проще того, что вам даёт визитёр. Потому можете просто использовать IS или каст и не париться.

Цитата Сообщение от skilllab Посмотреть сообщение
и Сразу ниже
Речь шла о передаче параметров в конструктор визитёра.

Цитата Сообщение от skilllab Посмотреть сообщение
Круто, конечно, но это ни разу не ответ по теме. Это размазывание и уход.
В смысле? Я описал, что не так с показанным вами кодом. Собственно, что вы и просили.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
15.06.2017, 08:46  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
можете просто использовать IS или каст и не париться
Нет, спасибо. Я уже иду в нужном правильном направлении.

Цитата Сообщение от Usaga Посмотреть сообщение
Речь шла
Речь всегда шла об одном и том же. И ни разу не о конструкторе, а о том, зачем вообще нужно передавать визитёру параметр.

Цитата Сообщение от Usaga Посмотреть сообщение
что не так с показанным вами кодом
Первых 4-х строчек вашего сообщения номер 15 было много более чем достаточно. Потом пошло что-то "не то".

Ещё раз: вы не можете меня окончательно понять именно по этому вопросу (что эта тема, что та). Вы натолкнули меня на 2 важные правильные мысли, за что и "спасибкал". Остальное в стиле "погугли", "вот шаблонный способ из первых трёх страниц гугло-ссылок, подстраивай сам", "ну что тут непонятного", "я устал..."

Не по теме:

Я вспомнил откуда вообще начал с вами знакомство на этом форуме ))))
Именно вы советовали во View использовать Model напрямую в Path элемента на форме. О да..., я потом нормально так "рефакторил" ))) с десяток UserControl-ов из-за непонимания почему у меня сущности модели изменяются напрямую без логики, без проверок заложенных специально вне сущности, без нотификации других свойств ViewModel

0
Эксперт .NET
 Аватар для Usaga
14314 / 9398 / 1355
Регистрация: 21.01.2016
Сообщений: 35,431
15.06.2017, 08:54
skilllab, было бы здорово посмотреть на программу (целиком), где такой подход понадобился. Есть подозрения (не сильно обоснованные), что можно было всё сделать настолько иначе, что две темы с визитёрами-рефлексиями могли оказаться лишними.

Если не хотите показывать основной проект, можете сотворить кастрированный вариант, демонстрирующий идею и потребность в обсуждаемом.

Добавлено через 4 минуты
Цитата Сообщение от skilllab Посмотреть сообщение
Речь всегда шла об одном и том же. И ни разу не о конструкторе, а о том, зачем вообще нужно передавать визитёру параметр.
Визитёру передаётся ссылка на класс, с которым нужно работать. Предполагается, что метод визитёра сам знает что и как с этим делать.

Цитата Сообщение от skilllab Посмотреть сообщение
Ещё раз: вы не можете меня окончательно понять именно по этому вопросу (что эта тема, что та)
Нет, я вас понял.
Цитата Сообщение от skilllab Посмотреть сообщение

Именно вы советовали во View использовать Model напрямую в Path элемента на форме. О да..., я потом нормально так "рефакторил" ))) с десяток UserControl-ов из-за непонимания почему у меня сущности модели изменяются напрямую без логики, без проверок заложенных специально вне сущности, без нотификации других свойств ViewModel
Всё верно. Так и должно быть. Просто на изменение сущности тоже нужно подписываться. Или оборачивать сущность в обёртку. Или хранить в ViewModel копию сущности с переносом и валидацией по факту нажатия "ОК" пользователем. Если вы недопоняли мой совет, то моя-то вина в чём?

Добавлено через 1 минуту
Цитата Сообщение от skilllab Посмотреть сообщение
Нет, спасибо. Я уже иду в нужном правильном направлении.
Если в этом направлении есть рефлексия, то вам не в ту сторону.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
15.06.2017, 09:44  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Если вы недопоняли мой совет
Не будем об этом. Не тема этого топика.

Цитата Сообщение от Usaga Посмотреть сообщение
демонстрирующий идею и потребность в обсуждаемом.
Ладушки. Вот код (с учётом одного вашего совета из соседней темы - уникальное свойство характеризующее тип класса), в котором всё что мне хотелось бы.
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
public enum Tag
    {
        one,
        two
    }
    public abstract class Animal
    {
        public abstract int ID { get;}
        public abstract Tag  Tag {get;}
        public abstract string Name { get; set; }
    }
    public class Horse:Animal
    {
        public override string Name { get; set; }
        public string Surname { get; set; }
        public Hoof Hoof { get; set; }
        public override Tag Tag => Tag.one;
 
        public override int ID { get;}
        public Horse(string _name, string _surname, Hoof _hoof, int _id)
        {
            Name = _name;
            Surname = _surname;
            ID = _id;
            Hoof = _hoof;
        }
    }
 
    public class Rabbit:Animal
    {
        public override string Name { get; set; }
        public Tail Tail { get; set; }
        public override Tag Tag => Tag.two;
 
        public override int ID { get;}
 
        public Rabbit(string _name, Tail _tail, int _id)
        {
            Name = _name;
            Tail = _tail;
            ID = _id;
        }
    }
    public class Tail
    {
        public bool IsPresent { get; set; }
        public Color Color { get; set; }
        public Tail(bool _isPresent, Color _color )
        {
            if (_isPresent)
            {
                Color = _color;
                IsPresent = true;
            }
            else
            {
                Color = Color.White;
            }
 
        }
    }
 
    public class Hoof
    {
        public bool IsPresent { get; set; }
        public bool IsBroken { get; set; }
 
        public Hoof (bool _isPresent, bool _isBroken = false)
        {
            IsPresent = _isPresent;
            IsBroken = _isBroken;
        }
    }
Хотелка
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
bool isTailPresent;
            List<Animal> anim = new List<Animal>()
            {
                new Horse("Кешик", "Иванов", new Hoof(true, true), 0),
                new Rabbit("Паша", new Tail(true, Color.AliceBlue), 1),
                new Horse("Кешик", "Петров", new Hoof(false), 2),
                new Rabbit("Миша", new Tail(false, Color.White), 3)
            };
 
            //Уйти от каста без пробежки по всей коллекции
            Horse horse = (Horse)anim[2];
            horse.Hoof.IsBroken = false;
 
            foreach(Animal current in anim)
            {
                if(current.Tag == Tag.one && current.ID == 2)
                {
                    //Уйти от каста
                    Horse currentHorse = (Horse)current;
                    currentHorse.Surname = "Уже не Иванов";
                }
                if(current.Tag == Tag.two)
                {
                    //Уйти от каста
                    Rabbit currentRabbit = (Rabbit)current;
                    currentRabbit.Tail.IsPresent = true;
                }
            }
 
            //Уйти от каста без пробежки по всей коллекции
            Rabbit rabbit = (Rabbit)anim[1];
            isTailPresent = rabbit.Tail.IsPresent;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.06.2017, 09:44
Помогаю со студенческими работами здесь

Свойство класса возвращает объект другого класса
Каким образом можно через свойство получить доступ ко всем методам объекта,который возвращает это свойство?? данный код не работает..можно...

Лямбда выражение в качестве параметра метода. Как получить свойство с которым производится операция?
Добрый день! Нужно в методе принимать лямбду: obj.Get(x=&gt;x.ParentId==5); Как мне из этой лямбды в методе Get получить...

Свойство класса в List(UI)
Доброго времени суток, заинтересовался следующим вопросом. Есть графический компонент List, и пользовательский класс допустим TNumber, у...

Как получить переменную из другого класса?
У меня в неком классе возникает событие и я хочу при возникновении этого события присвоить значение строковой переменной, а потом по...

Как получить ссылку на метод класса
Имеем некоторый класс: using System; using System.Collections.Generic; using System.Reflection; class SomeClass { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru