Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3      [все]
 c# верификация типов свойств класса  [new]
Nechto
Member

Откуда:
Сообщений: 798
Добрый день! Всех с рождеством!

Подскажите пожалуйста можно ли каким-то способом определить, свойство с типом Tzm?

public class Position
{
    public string Code { get; set; }
    public string Caption { get; set; }

    public Tzm Tzm { get; set; } // НЕ ЗНАЮ КАК ЭТО СВОЙСТВО ВЫЯВИТЬ
    public ICollection<Mch> Mch { get; set; }  
}
public class Tzm
{
    public int Code { get; set; }
}

// ...

var type = typeof(Position).GetType();
var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(w => w.CanWrite);
foreach (var property in properties)
{
    if (typeof(IEnumerable).IsAssignableFrom(property.PropertyType) && property.PropertyType != typeof(string))
    {
         var genericType = property.PropertyType.GetGenericArguments().First();
         var entity = Activator.CreateInstance(genericType);
    }
    
    if (property.PropertyType.Name == property.Name)
    {
         // есть ли ещё один способ выявить свойство Tmz ???
    }
}
7 янв 19, 19:45    [21779582]     Ответить | Цитировать Сообщить модератору
 Re: c# верификация типов свойств класса  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4318
Nechto,
нну наверно так
  foreach (var property in typeof(Position).GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                if (property.PropertyType== typeof(Tzm))
                {
                    гы
                }
              
            }
7 янв 19, 21:29    [21779621]     Ответить | Цитировать Сообщить модератору
 Re: c# верификация типов свойств класса  [new]
Nechto
Member

Откуда:
Сообщений: 798
Где-то в степи
Nechto,
нну наверно так
  foreach (var property in typeof(Position).GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                if (property.PropertyType== typeof(Tzm))
                {
                    гы
                }
              
            }


Такой способ решения очевиден. Я так понимаю решения по сути нет, так как типы свойств тоже классы. Если использовать джинерик, то выход только один и это строгое наименование.
7 янв 19, 22:03    [21779641]     Ответить | Цитировать Сообщить модератору
 Re: c# верификация типов свойств класса  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4318
Nechto,

позорище, 8 лет коту под хвост
7 янв 19, 23:17    [21779674]     Ответить | Цитировать Сообщить модератору
 Re: c# верификация типов свойств класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3412
не понял, что хочет автор...
да и вообще, зачем...
7 янв 19, 23:30    [21779682]     Ответить | Цитировать Сообщить модератору
 Re: c# верификация типов свойств класса  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20468
Roman Mejtes
не понял, что хочет автор...
да и вообще, зачем...
Понять бы - что. Потом уже можно обосновать - зачем.
7 янв 19, 23:32    [21779683]     Ответить | Цитировать Сообщить модератору
 Re: c# верификация типов свойств класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3412
var type = typeof(Position).GetType();
Разве вот эта строка не вернет тип типа Type?
typeof(T) возвращает тип Type, а GetType() возвращает тип типа Type или что вообще? :D
7 янв 19, 23:32    [21779684]     Ответить | Цитировать Сообщить модератору
 Re: c# верификация типов свойств класса  [new]
hVostt
Member

Откуда:
Сообщений: 15626
Nechto
if (property.PropertyType.Name == property.Name)
    {
         // есть ли ещё один способ выявить свойство Tmz ???
    }


дичь какая-то Картинка с другого сайта.


Nechto
Я так понимаю решения по сути нет, так как типы свойств тоже классы.


либо надо выпить палёнки, либо объясните по-человечески, чего хотите? зачем? для чего? озвучите цель!
8 янв 19, 01:35    [21779703]     Ответить | Цитировать Сообщить модератору
 Re: c# верификация типов свойств класса  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Roman Mejtes
не понял, что хочет автор...
да и вообще, зачем...
не хочет стабильности и проектирования.
Все темы про то как программировать, когда ничего не известно.
https://ru.m.wikipedia.org/wiki/Рефлексия_(программирование)
8 янв 19, 13:32    [21779846]     Ответить | Цитировать Сообщить модератору
 Re: c# верификация типов свойств класса  [new]
Nechto
Member

Откуда:
Сообщений: 798
Я всего лишь задал вопрос, а не просил переходить на личности!
Нужно разработать WPF приложение, которое будет открывать xml файл и выводить его содержимое на экран в виде дерева (таблицы).
Xml файл состоит из - тегов и атрибутов. Выгружать нужно определённые теги и атрибуты, не все содержимое файла.

Мой способ решения:
1.) Описать каждый тег классами. Наименнование классов и свойств имеют идентичные наименование с тегам и атрибутами xml документа
public class Position // Тег Position 
{
    public string Caption { get; set; } // атрибут Caption  
    public Tzm Tzm { get; set; } // вложенный тег Tzm со своей атрибутикой описанной в классе Tzm 
    public ICollection<Mch> Mch { get; set; } // коллекция вложенных тегов Mch со своей атрибутикой описанной в классе Mch    
}
2.) Написал рекурсивную функцию, которая перебирает классы, свойства и коллекции классов и заносит данные из xml файла.
Как раз здесь у меня и возникла трудность как идентифицировать public Tzm Tzm { get; set; }, стандартными методами класса Type.
8 янв 19, 19:38    [21780061]     Ответить | Цитировать Сообщить модератору
 Re: c# верификация типов свойств класса  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20468
Nechto
как идентифицировать
понятнее не стало. Неизвестно, что ты вкладываешь в этот термин? Найти свойство по известному типу? Найти свойство по имени? Определить тип по имени? Еще что-то?

А вообще, XDocument настолько легко проецируется на TreeView, что я не знаю, что тут еще изобретать надо....

Опять же, зачем писать парсер руками, если есть десериализатор из коробки.
8 янв 19, 19:46    [21780066]     Ответить | Цитировать Сообщить модератору
 Re: c# верификация типов свойств класса  [new]
Nechto
Member

Откуда:
Сообщений: 798
Shocker.Pro
Nechto
как идентифицировать
понятнее не стало. Неизвестно, что ты вкладываешь в этот термин? Найти свойство по известному типу? Найти свойство по имени? Определить тип по имени? Еще что-то?

В процессе выполнения алгоритма, нужно определить чем является тип свойства:
1. Классом описывающий тег (если так, то я его активирую и вношу все атрибуты)
2. Свойством описывающий атрибут. (просто вношу значения атрибута)


Shocker.Pro
Nechto
как идентифицировать

А вообще, XDocument настолько легко проецируется на TreeView, что я не знаю, что тут еще изобретать надо....
Опять же, зачем писать парсер руками, если есть десериализатор из коробки.


Такое может выгрузить в treeview?
<Post Id="0" Caption="aaaaaa" Code="US">
     <Position Caption="Строка 1" SysID="1" Number="5">
           <Post>
                 <Mz Name="A1" Id="11" Value="548231"/>
                 <Mt Name="Б2" Id="0" Value="42323"/>
                 <Mt Name="Б3" Id="1" Value="31231"/>
           </Post>
     </Position>
</Post> 
<Post Id="1" Caption="bbbbbb" Code="US">
     <Position Caption="Строка 1" SysID="1" Number="5">
           <Post>
                 <Mz Name="A1" Id="11" Value="548231"/>
                 <Mt Name="Б2" Id="0" Value="42323"/>
                 <Mt Name="Б3" Id="1" Value="31231"/>
           </Post>
     </Position>
</Post> 
8 янв 19, 20:13    [21780073]     Ответить | Цитировать Сообщить модератору
 Re: c# верификация типов свойств класса  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20468
А нельзя выражаться еще яснее?

Nechto
нужно определить чем является тип свойства:
1. Классом...
2. Свойством...

1. тип свойства является классом
2. тип свойства является свойством
расшифруй
8 янв 19, 20:18    [21780074]     Ответить | Цитировать Сообщить модератору
 Re: c# верификация типов свойств класса  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20468
Nechto
Такое может выгрузить в treeview?
  • TreeView отображает иерархический IEnumerable
  • XDocument является иерархическим IEnumerable
    Всё. Этого достаточно, чтобы спроецировать XDocument на TreeView. То есть там даже код почти не нужен, только шаблон для узла
  • 8 янв 19, 20:20    [21780075]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Nechto
    Member

    Откуда:
    Сообщений: 798
    Shocker.Pro
    А нельзя выражаться еще яснее?

    Nechto
    нужно определить чем является тип свойства:
    1. Классом...
    2. Свойством...

    1. тип свойства является классом
    2. тип свойства является свойством
    расшифруй


    1. public Tzm Tzm { get; set; } //(в xml это тег <Tmz Id="1" Code="Текст" ... >)
    2. public string Code { get; set; } //(в xml это атрибут <X Code="Текст">)
    
    8 янв 19, 20:25    [21780079]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 20468
    Ну то есть у тебя не получается отличить с помощью рефлекшена string от не-string-а? Правильно я расшифровал?
    8 янв 19, 20:39    [21780080]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 20468
    Но опять же, для этой цели (помечать нужные свойства) существуют штатные атрибуты [XmlAttribute] и [XmlElement]. Существует уже готовый встроенный класс для вот этого:
    Nechto
    Написал рекурсивную функцию, которая перебирает классы, свойства и коллекции классов и заносит данные из xml файла.
    Существует куча инструментов, которые создают тебе класс по xsd-схеме, либо по готовому xml (если схемы у тебя нет). Непонятно, зачем писать свои велосипеды (разве что для учебных целей)
    8 янв 19, 21:20    [21780095]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Roman Mejtes
    Member

    Откуда: г. Пермь
    Сообщений: 3412
    WPF поддерживает XPath возможность стоит смотреть в этом направлении.
    Типы значений (структуры) наследуют тип ValueType, возможно стоит исходить из этого, если нужно редактировать это значение, то имеет смысл проверять их на IConvertible и преобразовывать их из строки в нужный вам тип.
    8 янв 19, 21:40    [21780103]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Roman Mejtes
    XPath

    +1
    Nechto
    Я всего лишь задал вопрос, а не просил переходить на личности!

    тебя 8 человек просят обрисовать задачу верхнего уровня (по ГУИ)


    Nechto
    Выгружать нужно определённые теги и атрибуты, не все содержимое файла.

    как выбирает юзверь что выгружать и что не выгружать?
    Как учитывается наследование?
    Как учитываются связи? Например в одной ноде справочник, а в другой ноде сбоку данные этого справочника классификатора?
    ЗЫ.
    Получается что тебе надо слово "конвертер" из А в Б.
    8 янв 19, 21:52    [21780108]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Roman Mejtes
    WPF поддерживает XPath возможность стоит смотреть в этом направлении.
    Типы значений (структуры) наследуют тип ValueType, возможно стоит исходить из этого, если нужно редактировать это значение, то имеет смысл проверять их на IConvertible и преобразовывать их из строки в нужный вам тип.

    мне кажется, что XML стоит вообще пока без типов рассматривать.
    автор
    Нужно разработать WPF приложение, которое будет открывать xml файл и выводить его содержимое на экран в виде дерева (таблицы).
    где тут типы?
    8 янв 19, 21:56    [21780110]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Nechto
    Такое может выгрузить в treeview?

    вариант1:
    XDocument doc = XDocument.Parse(str); 
    ...
    foreach(var child in item.ChildNodes)
          tree.Add(.....
        {
    
    8 янв 19, 22:09    [21780117]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Nechto
    Выгружать нужно определённые теги и атрибуты, не все содержимое файла.
    вариант решения №2 - загружаете весь XML (либо циклом либо сериализатором). Потом просто фильтруете (скрываете видимость)
    node.visible=false
    8 янв 19, 22:22    [21780120]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 15626
    Nechto
    Мой способ решения:
    1.) Описать каждый тег классами.


    Плохое решение. XDocument, XPath, а для описания структуры XSD.

    Если речь идёт о тупой (де)сериализации в XML, читайте соответствующую литературу.
    9 янв 19, 03:16    [21780191]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Nechto
    Member

    Откуда:
    Сообщений: 798
    Правильно сказали, велосипед сделал исключительно из интереса.

    Учитывая ваши советы, решил использовать XDocument. В велосипеде использовал XmlDocument.

    // ModelView.cs
    var xdoc = XDocument.Load(@"myfile.xml");
    Items = xdoc.Descendants("Chapter");
    
    private IEnumerable<XElement> _items;
    public IEnumerable<XElement> Items
    {
        get { return _items; }
        set
        {
            if (_items != value)
            {
                _items = value;
                RaisePropertyChanged("Items");
             }
         }
    }
    

    <!--View.Xaml-->
    <TreeView ItemsSource="{Binding Items2}">
        <!-- теперь я так понимаю нужно описать узлы (шаблоны), используя XPath -->
    </TreeView>
    
    9 янв 19, 08:02    [21780228]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Nechto,
    Модель делают на классах, а не на текстовых файлах xml.
    Т.е. одноразовый импорт в классы и потом забыть про xml.
    9 янв 19, 09:39    [21780278]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Nechto
    исключительно из интереса.
    увы. Такой ваш интерес неинтересен никому.
    9 янв 19, 09:40    [21780279]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Сон Веры Павловны
    Member

    Откуда:
    Сообщений: 5042
    Nechto
    Такое может выгрузить в treeview?
    <Post Id="0" Caption="aaaaaa" Code="US">
         <Position Caption="Строка 1" SysID="1" Number="5">
               <Post>
                     <Mz Name="A1" Id="11" Value="548231"/>
                     <Mt Name="Б2" Id="0" Value="42323"/>
                     <Mt Name="Б3" Id="1" Value="31231"/>
               </Post>
         </Position>
    </Post> 
    <Post Id="1" Caption="bbbbbb" Code="US">
         <Position Caption="Строка 1" SysID="1" Number="5">
               <Post>
                     <Mz Name="A1" Id="11" Value="548231"/>
                     <Mt Name="Б2" Id="0" Value="42323"/>
                     <Mt Name="Б3" Id="1" Value="31231"/>
               </Post>
         </Position>
    </Post> 
    

    Да легко:
    <Window
      x:Class="wpftest.MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:wpftest="clr-namespace:wpftest"
      Height="700"
      Width="700">
    
    
      <Window.Resources>
        <XmlDataProvider x:Key="XmlData" XPath="/root">
          <x:XData>
            <root xmlns="">
              <Post Id="0" Caption="aaaaaa" Code="US">
                <Position Caption="Строка 1" SysID="1" Number="5">
                  <Post>
                    <Mz Name="A1" Id="11" Value="548231"/>
                    <Mt Name="Б2" Id="0" Value="42323"/>
                    <Mt Name="Б3" Id="1" Value="31231"/>
                  </Post>
                </Position>
              </Post>
              <Post Id="1" Caption="bbbbbb" Code="US">
                <Position Caption="Строка 1" SysID="1" Number="5">
                  <Post>
                    <Mz Name="A1" Id="11" Value="548231"/>
                    <Mt Name="Б2" Id="0" Value="42323"/>
                    <Mt Name="Б3" Id="1" Value="31231"/>
                  </Post>
                </Position>
              </Post>
            </root>
          </x:XData>
        </XmlDataProvider>
        <HierarchicalDataTemplate x:Key="XmlTemplate">
          <HierarchicalDataTemplate.Resources>
            <wpftest:XmlElementConverter x:Key="XmlElementConverter" />
          </HierarchicalDataTemplate.Resources>
          <TextBlock Text="{Binding Converter={StaticResource XmlElementConverter}}" />
          <HierarchicalDataTemplate.ItemsSource>
            <Binding XPath="child::node()" />
          </HierarchicalDataTemplate.ItemsSource>
        </HierarchicalDataTemplate>
      </Window.Resources>
    
      <TreeView
        Margin="10"
        ItemsSource="{Binding Source={StaticResource XmlData}, XPath=Post}"
        ItemTemplate="{StaticResource XmlTemplate}" />
    </Window>
    

    namespace wpftest
    {
      public partial class MainWindow
      {
        public MainWindow()
        {
          InitializeComponent();
        }
      }
    
      public class XmlElementConverter: IValueConverter
      {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
          if (!(value is XmlElement xe)) return DependencyProperty.UnsetValue;
          var sb = new StringBuilder();
          sb.Append(xe.Name);
          foreach (XmlAttribute xa in xe.Attributes)
            sb.Append(" ").Append(xa.Name).Append("=\"").Append(xa.Value).Append("\"");
          return sb.ToString();
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
          throw new NotImplementedException();
        }
      }
    }
    

    Собственно, в xaml-разметке большая часть строк кода - от заинлайненного xml, который является источником данных.

    К сообщению приложен файл. Размер - 8Kb
    9 янв 19, 10:34    [21780320]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9560
    Petro123
    Nechto,
    Модель делают на классах, а не на текстовых файлах xml.
    Т.е. одноразовый импорт в классы и потом забыть про xml.

    в классах делают кодеры
    9 янв 19, 10:51    [21780331]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9560
    Сон Веры Павловны,

    +1
    а то все блабла
    9 янв 19, 10:52    [21780333]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    ViPRos
    в классах делают кодеры
    угу. И фаулер это пустозвон.
    9 янв 19, 10:57    [21780343]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9560
    Petro123,

    фаулер зарабатывает свое бабло, как и голдрат, деминг, и т.д. японцы
    9 янв 19, 13:03    [21780494]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    ViPRos
    Petro123,
    фаулер зарабатывает свое бабло, как и голдрат, деминг, и т.д. японцы

    В форуме собрались те, кто так не считает.
    9 янв 19, 13:37    [21780520]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9560
    Petro123,

    гнать надо :)
    9 янв 19, 13:55    [21780542]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    skyANA
    Member

    Откуда: Зеленоград
    Сообщений: 26531
    ViPRos
    Petro123,

    фаулер зарабатывает свое бабло, как и голдрат, деминг, и т.д. японцы

    Ты бы тоже делом занялся :)
    9 янв 19, 14:01    [21780550]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9560
    skyANA,

    да уж, надо было пойти на системщика в свое время
    9 янв 19, 17:43    [21780902]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9560
    skyANA,

    да уж, надо было пойти на системщика в свое время
    9 янв 19, 17:45    [21780904]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9560
    а я всякую фигню пытаюсь продать

    К сообщению приложен файл. Размер - 106Kb
    9 янв 19, 17:46    [21780909]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Nechto
    Member

    Откуда:
    Сообщений: 798
    Ко всем прислушался и вот что в итоге получил:
    1. Модель данных есть
    2. Выгрузка происходит один раз, и после про xml файл забываем
    3. Наполнение Items без велосипеда, стандартными методами linq (XDocument, XmlSerializer)
    4. Результат IEnumerable

    Остался TreeView, но с ним у меня туго.Сон Веры Павловны помогите пожалуйста, а то я не пойму как XPath использовать без XmlDataProvider.

    // XML
    <root>
    <Chapter Caption="chap1" SysID="1">
        <Position Caption="A" SysID="1">
            <Quantity Result="ignore element"/>   
            <Resources>
                <Tzm Caption="a" Code="1"/>
                <Mch Caption="rrr11" Code="0011"/>
                <Mch Caption="rrr12" Code="0012"/>
            </Resources>
        </Position>
    	<Position Caption="B" SysID="2">
            <Quantity Result="ignore element"/>   
            <Resources>
                <Tzm Caption="b" Code="2"/>
                <Mch Caption="rrr21" Code="0021"/>
                <Mch Caption="rrr22" Code="0022"/>
    			<Mch Caption="rrr23" Code="0023"/>
            </Resources>
        </Position>
    </Chapter>
    <Chapter Caption="chap2" SysID="2">
        <Position Caption="A" SysID="1">
            <Quantity Result="ignore element"/>   
            <Resources>
                <Tzm Caption="a" Code="1"/>
                <Mch Caption="rrr11" Code="0011"/>
                <Mch Caption="rrr12" Code="0012"/>
            </Resources>
        </Position>
    	<Position Caption="B" SysID="2">
            <Quantity Result="ignore element"/>   
            <Resources>
                <Tzm Caption="b" Code="2"/>
            </Resources>
        </Position>
    </Chapter>
    </root>
    
    // MODEL
    public class Chapter
    {
        public int SysId { get; set; }
        public string Caption { get; set; }
        public IEnumerable<Position> Position { get; set; } 
    }
    public class Position
    {
        public int SysId { get; set; }
        public string Caption { get; set; }
        public Tzm Tzm { get; set; }
        public IEnumerable<Mch> Mch { get; set; }  
    }
    [XmlRoot("Tzm")]
    public class Tzm
    {
        [XmlAttribute("Code")]
        public int Code { get; set; }
        [XmlAttribute("Caption")]
        public string Caption { get; set; }
    }
    public class Mch
    {
        public string Code { get; set; }
        public string Caption { get; set; }
    }
    
    // VIEW_MODEL
    var xdoc = XDocument.Load(@"myXml.xml");
    IEnumerable<Chapter> Items = xdoc.Descendants("Chapter").Select(chapter => new Chapter
    {
        SysId = (int)chapter.Attribute("SysID"),
        Caption = (string)chapter.Attribute("Caption"),
        Position = chapter.Descendants("Position").Select(position =>
        {
            var tzm = position.Descendants("Tzm").FirstOrDefault();
            return new Position
            {
                SysId = (int)position.Attribute("SysID"),
                Caption = (string)position.Attribute("Caption"),
                Tzm = tzm != null ? (Tzm)(new XmlSerializer(typeof(Tzm))).Deserialize(tzm.CreateReader()) : null,
    			Mch = position.Descendants("Mch").Select(mch => new Mch
                {
                    Code = (string)mch.Attribute("Code"),
                    Caption = (string)mch.Attribute("Caption")
                })
            };
        })
    });
    
    // VIEW
    <TreeView Margin="10" ItemsSource="{Binding Items2}"/>
    
    9 янв 19, 21:01    [21781036]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Antonariy
    Member

    Откуда: ☭
    Сообщений: 72766
    Nechto
    Добрый день! Всех с рождеством!

    Подскажите пожалуйста можно ли каким-то способом определить, свойство с типом Tzm?
    Оно одно? Если одно, то так:

                var property = typeof(Position)
                    .GetProperties(BindingFlags.Instance | BindingFlags.Public)
                    .FirstOrDefault(w => w.CanWrite && w.PropertyType.Equals(typeof(Tzm)));
    
    9 янв 19, 21:46    [21781053]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Antonariy
    Member

    Откуда: ☭
    Сообщений: 72766
    Nechto
    Такой способ решения очевиден. Я так понимаю решения по сути нет
    повелитель взаимоисключающих параграфов детектед.
    9 янв 19, 21:49    [21781055]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 20468
    Antonariy, а ты не пробовал сначала прочесть весь топик, а потом отвечать? Картинка с другого сайта.
    Или сейчас получим ответ на каждый вопрос, который уже проехали? Картинка с другого сайта.
    9 янв 19, 21:52    [21781058]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Antonariy
    Member

    Откуда: ☭
    Сообщений: 72766
    Shocker.Pro
    Antonariy, а ты не пробовал сначала прочесть весь топик, а потом отвечать? Картинка с другого сайта.
    Или сейчас получим ответ на каждый вопрос, который уже проехали? Картинка с другого сайта.
    а что, так можно? o_O
    9 янв 19, 22:08    [21781063]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 20468
    Такой способ не даст повода твоим врагам упрекнуть тебя в слоупочестве.
    9 янв 19, 22:17    [21781070]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Roman Mejtes
    Member

    Откуда: г. Пермь
    Сообщений: 3412
    тему перенесите, вопросы по WPF, а не по WF
    Использовать обычный Path в binding
    <Binding Path=""/> или {Binding PropertyName}
    И нужно нормальное наследование сделать в модели представления для Mch и Tmz или не использовать Generic'и, лучше 1ое
    9 янв 19, 22:37    [21781083]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Аффтар, у вас препод задал дерево отобразить?
    Тогда Модель это один класс tree.
    Вы бизнес логику проехали при моделировании.
    9 янв 19, 23:20    [21781110]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Antonariy
    Member

    Откуда: ☭
    Сообщений: 72766
    Сон Веры Павловны
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
          if (!(value is XmlElement xe)) return DependencyProperty.UnsetValue;
          var sb = new StringBuilder();
          sb.Append(xe.Name);
          foreach (XmlAttribute xa in xe.Attributes)
            sb.Append(" ").Append(xa.Name).Append("=\"").Append(xa.Value).Append("\"");
          return sb.ToString();
        }
    

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (!(value is XmlElement xe)) return DependencyProperty.UnsetValue;
                return $"{xe.Name}{string.Join("", xe.Attributes.ToIEnumerable<XmlAttribute>().Select(xa => $" {xa.Name}=\"{xa.Value}\""))}";
            }
    
    public static class ICollectionExt
        {
            public static IEnumerable<T> ToIEnumerable<T>(this ICollection col) where T : class
            {
                if (col == null) return null;
                var ret = new List<T>();
                if (col.Count > 0)
                {
                    var enu = col.GetEnumerator();
                    enu.MoveNext();
                    for (var i = 0; i < col.Count; i++)
                    {
                        ret.Add(enu.Current as T);
                        enu.MoveNext();
                    }
                }
                return ret;
            }
        }
    
    9 янв 19, 23:41    [21781133]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Сон Веры Павловны
    Member

    Откуда:
    Сообщений: 5042
    Antonariy
    public static class ICollectionExt
        {
            public static IEnumerable<T> ToIEnumerable<T>(this ICollection col) where T : class
            {
                if (col == null) return null;
                var ret = new List<T>();
                if (col.Count > 0)
                {
                    var enu = col.GetEnumerator();
                    enu.MoveNext();
                    for (var i = 0; i < col.Count; i++)
                    {
                        ret.Add(enu.Current as T);
                        enu.MoveNext();
                    }
                }
                return ret;
            }
        }
    

    Enumerable.Cast(IEnumerable) Method (System.Linq) | Microsoft Docs
    Только реализовано несколько более изящно - хотя бы потому, что поддерживает ленивую обработку.
    А еще там есть Enumerable.OfType, тоже хорошая штука. Ну и еще много чего хорошего.
    Antonariy
    return $"{xe.Name}{string.Join("", xe.Attributes.ToIEnumerable<XmlAttribute>().Select(xa => $" {xa.Name}=\"{xa.Value}\""))}";
    

    И смысл в этом плохо читаемом хвосте? С т.з. оптимизации - никакого, т.к. компилятор всю эту интерполяцию развернет в string.Concat+string.Join, а внутри последнего используется всё тот же StringBuilder. Вызов вышеприведенного extension-метода будет менее оптимальным, чем foreach (из-за аллокаций List<T>), а если использовать родной Cast<T>, то будет ровно то же самое, что и с foreach. Просто чтобы использовать новую фичу? А в коде с явным foreach сразу навскидку видно, что происходит.
    Nechto
    Сон Веры Павловны помогите пожалуйста, а то я не пойму как XPath использовать без XmlDataProvider.

    Какой тут нафиг XPath, если используется биндинг TreeView к обычной коллекции, и если используется xml-маппинг. Десериализуйте xml в коллекцию с помощью XmlSerializer, и всё.
    10 янв 19, 07:31    [21781204]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Antonariy
    Member

    Откуда: ☭
    Сообщений: 72766
    Сон Веры Павловны
    Ну и еще много чего хорошего.
    Так и знал, что велосипед изобретаю )
    Сон Веры Павловны
    И смысл в этом плохо читаемом хвосте?
    В студии в боевой раскраске он читается аки Пушкин.
    Меньше кода - больше смысла на экранную площадь.
    10 янв 19, 08:02    [21781214]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Сон Веры Павловны
    Member

    Откуда:
    Сообщений: 5042
    Antonariy
    В студии в боевой раскраске он читается аки Пушкин.
    Меньше кода - больше смысла на экранную площадь.

    Ну, кому как - по мне, так интерполяция строк - самая сомнительная фича новых версий языка. Когда в строке много интерполируемых выражений, и сами по себе эти выражения достаточно длинные, то общее выражение интерполяции выглядит крайне вырвиглазно. Обычный string.Format смотрится куда аккуратнее. Я даже в решарпере предложение заменить формат на интерполяцию отключил, и саму интерполяцию использую только когда интерполиируемых кусков 2-3, и все они - обычные переменные.
    10 янв 19, 08:09    [21781217]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Antonariy
    Member

    Откуда: ☭
    Сообщений: 72766
    Сон Веры Павловны
    Когда в строке много интерполируемых выражений, и сами по себе эти выражения достаточно длинные, то общее выражение интерполяции выглядит крайне вырвиглазно.
    с этим согласен, из пары подобных выражений я бы уже не стал интерполяцию делать.
    10 янв 19, 10:22    [21781310]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 15626
    Сон Веры Павловны
    Какой тут нафиг XPath, если используется биндинг TreeView к обычной коллекции, и если используется xml-маппинг. Десериализуйте xml в коллекцию с помощью XmlSerializer, и всё.


    Слишком просто. Не наш путь
    10 янв 19, 10:48    [21781338]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt,
    ))


    Nechto
    // MODEL
    public class Chapter
    {
        public int SysId { get; set; }
        public string Caption { get; set; }
        public IEnumerable<Position> Position { get; set; } 
    }
    public class Position
    {
        public int SysId { get; set; }
        public string Caption { get; set; }
        public Tzm Tzm { get; set; }
        public IEnumerable<Mch> Mch { get; set; }  
    }
    [XmlRoot("Tzm")]
    public class Tzm
    {
        [XmlAttribute("Code")]
        public int Code { get; set; }
        [XmlAttribute("Caption")]
        public string Caption { get; set; }
    }
    public class Mch
    {
        public string Code { get; set; }
        public string Caption { get; set; }
    }
    

    Вместо этого один класс:
    class Tree<string>
    10 янв 19, 11:05    [21781351]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Nechto
    Member

    Откуда:
    Сообщений: 798
    Petro123
    Вместо этого один класс:
    class Tree<string>


    Окончательно запутался. Это за гранью моего воображения, как мою модель можно уместить в class Tree<string>? И после этого её ещё заполнить.
    Вроде следовал вашим советам, и по итогу опять все неправильно :(
    11 янв 19, 10:59    [21782540]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Nechto
    Это за гранью моего воображения
    кто вам мешает разговаривать, уточнять, взвешивать?
    Вы конечную цель не озвучили. Значит по ТЗ я догадался что вам просто нужно показать xml в виде дерева.
    Смотрите выше пост про бизнес логику.
    Так?
    Тогда обоснуйте, чем модель дерева не подходит для визуализации xml?
    Ждем.
    11 янв 19, 11:18    [21782557]     Ответить | Цитировать Сообщить модератору
     Re: c# верификация типов свойств класса  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Nechto
    И после этого её ещё заполнить.
    выше мой псевдо код видели?
    Да. Одна нода это строка с перечислением атрибутов.
    11 янв 19, 11:20    [21782559]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2 3      [все]
    Все форумы / WinForms, .Net Framework Ответить