Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 22.10.2017
Сообщений: 55

Определение типа объекта System.Collections.Generic

23.08.2019, 08:56. Показов 5425. Ответов 33

Студворк — интернет-сервис помощи студентам
Добрый день.

Может быть кто-то подскажет, как однозначно определить, какого типа объект, который является коллекцией элементов System.Collections.Generic. Имеется в виду это dictionary<Tkey,Tvalue>, List<>, Collection<> и т.д. ?

У объекта получается его тип через tagType = object.GetType(), в котором есть признак что это Generic - tagType.IsGenericType = true, есть список атрибутов типа tagType.GetGenericArguments(), в котором указываются типы используемые в исходном объекте (у List соответственно 1 аргумент, у dictionary 2 и т.п.). В FullName указан тип в виде строки "System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]", но хотелось бы чтобы это была не строка, а прям какой то тип языка...

Куда копать? кто подскажет...
Миниатюры
Определение типа объекта System.Collections.Generic  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.08.2019, 08:56
Ответы с готовыми решениями:

Как из ArrayList получить System.Collections.Generic.List
Есть следующая переменная: System.Collections.ArrayList arrayList; которая содержит элементы типа elemType (Type elemType = какой-то...

Generic, определение типа переменной во время выполнения программы
Итак имеется две переменной: одна переменная хранит тип значения (точнее числовое значение одного из типов в моем enum'e) Для ясности...

System.Collections.IEnumerable; как его подключить?
int badhands ;//: System.Collections.IEnumerable; badhands =new int : System.Collections.IEnumerable; ...

33
0 / 0 / 0
Регистрация: 22.10.2017
Сообщений: 55
26.08.2019, 06:34  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Usaga Посмотреть сообщение
auskst, что проблематично? Вы сами сказали, что схема данных известна. Значит у вас на руках есть классы эту схему описывающих? Или нету? Или вы не поняли о чём я?
как то так

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
    public class ОписаниеДанных
    {
        public bool НеДейтствительны;
 
        public ОписаниеДанных(string объект, DataSet данные)
        {
        }
 
        private ОписаниеДанных()
        {
        }
 
        private int _идПользователя;
        private ПраваДоступа _права;
 
        public int Ид { get; private set; }
 
        public string Объект { get; private set; }
 
        public DataTable Субконто { get; private set; }
 
        public DataTable Реквизиты { get; private set; }
 
        public DataSet ПустыеРеквизиты { get; internal set; }
 
        public DataTable СписокТабличныхЧастей { get; private set; }
        
        public DataTable СписокРегистровПроведения { get; private set; }
 
        public DataTable СписокВводаНаОсновании { get; private set; }
 
        public DataTable СписокПодчиненныхСправочников { get; private set; }
 
        public Dictionary<string, DataSet> ФормыСписковСправочника = new Dictionary<string, DataSet>();
 
        public string Представление { get; private set; }
 
        public string Проект { get; private set; }
 
        public string ИмяФайлаСборки { get; private set; }
 
        public string ИмяБазыДанных { get; private set; }
 
        public ПраваДоступа ТекущиеПрава
        {
            get            {                 }
            set            {            }
        }
 
        public bool СодержитДопПараметры { get; private set; }      
 
        public static DataTable ВсеПеречисления        {            get            {            }        }       
        
        public static DataTable ВсеСправочники        {            get            {            }        }        
 
        public static DataTable ВсеДокументы        {            get            {            }        }
 
        public static DataTable ВсеЖурналы        {            get            {            }        }
 
        public static DataTable ПланСчетов        {            get            {            }        }
 
    }
0
Эксперт .NET
 Аватар для Usaga
14578 / 9485 / 1360
Регистрация: 21.01.2016
Сообщений: 35,779
26.08.2019, 07:33
auskst, русский язык для именования свойств и классов? Серьёзно, чтоли?

И почему DataTable? Если схема заранее известна, то правильнее (и сильно удобнее для дальнейшей работы) завести классы.
0
0 / 0 / 0
Регистрация: 22.10.2017
Сообщений: 55
26.08.2019, 07:59  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
auskst]
русский язык для именования свойств и классов? Серьёзно, чтоли?
Есть так как есть) Сначала тоже было не привычно, а потом пофигу в общем то...

Цитата Сообщение от Usaga Посмотреть сообщение
auskst]
И почему DataTable? Если схема заранее известна, то правильнее (и сильно удобнее для дальнейшей работы) завести классы.
Строки DataTable содержат общие поля и другие классы в колонках строки, сделано так, переделывать нет необходимости, да и наверно возможности...
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
26.08.2019, 15:21
Цитата Сообщение от auskst Посмотреть сообщение
var genericArguments =object.GetType().GetGenericArguments(); foreach(KeyValuePair<genericArguments[0],genericArguments[1]> in (Dictionary<genericArguments[0],genericArguments[1]>)object) { }
Цитата Сообщение от auskst Посмотреть сообщение
хотелось бы все таки еще получить ответ, если это возможно, на мой вопрос (Определение типа объекта System.Collections.Generic), как правильно подставить типы аргументов, чтобы исходный объект привести к нужному типу коллекции?
Что будет внутри блока foreach ? Пример.
0
0 / 0 / 0
Регистрация: 22.10.2017
Сообщений: 55
27.08.2019, 06:33  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Что будет внутри блока foreach ? Пример.
Например так

C#
1
2
3
4
foreach (var value in e.Node.Tag as Dictionary<string,DataSet>)
{
       AppendNodes(value, value.Key, value.Value, value.Value.GetType(), value.Value, e.Node);
}
Добавлено через 51 секунду
Цитата Сообщение от Usaga Посмотреть сообщение
auskst, русский язык для именования свойств и классов? Серьёзно, чтоли?

И почему DataTable? Если схема заранее известна, то правильнее (и сильно удобнее для дальнейшей работы) завести классы.
я так понимаю, auto mapper тут не поможет?)
0
Эксперт .NET
 Аватар для Usaga
14578 / 9485 / 1360
Регистрация: 21.01.2016
Сообщений: 35,779
27.08.2019, 07:08
auskst, да, тут руками придётся всё конвертить. Вообще, модель в конец мутная)
0
0 / 0 / 0
Регистрация: 22.10.2017
Сообщений: 55
27.08.2019, 07:18  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
auskst, да, тут руками придётся всё конвертить. Вообще, модель в конец мутная)
абстракция, мать ее)
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
27.08.2019, 10:03
auskst, как должен выполняться код value.Key, value.Value, если value это произвольный тип без свойств Key, Value?
Как выглядит сигнатура метода AppendNodes? Там string, DataSet на входе?
0
0 / 0 / 0
Регистрация: 22.10.2017
Сообщений: 55
27.08.2019, 13:31  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
auskst, как должен выполняться код value.Key, value.Value, если value это произвольный тип без свойств Key, Value?
Как выглядит сигнатура метода AppendNodes? Там string, DataSet на входе?
Какой производный тип?

P.S. Вы мне помочь хотите или свою какую-то задачу решаете?
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
27.08.2019, 14:58
Цитата Сообщение от auskst Посмотреть сообщение
Какой производный тип?
Не производный а произвольный, всмысле любой другой.

Цитата Сообщение от auskst Посмотреть сообщение
P.S. Вы мне помочь хотите или свою какую-то задачу решаете?
Конечно помочь. Интересен ваш ход мыслей, насколько быстро вы поймете логическое противоречие в предложенном варианте кода.
0
0 / 0 / 0
Регистрация: 22.10.2017
Сообщений: 55
27.08.2019, 15:05  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Не производный а произвольный, всмысле любой другой.

Конечно помочь. Интересен ваш ход мыслей, насколько быстро вы поймете логическое противоречие в предложенном варианте кода.
C#
1
foreach (var value in e.Node.Tag as Dictionary<string,DataSet>)
а тут разве не приводится к нужному типу?

Цитата Сообщение от nicolas2008 Посмотреть сообщение
Конечно помочь. Интересен ваш ход мыслей, насколько быстро вы поймете логическое противоречие в предложенном варианте кода.
логическое противоречие в чем?

Вот код

C#
1
2
3
4
5
6
7
8
9
10
if (tagType.GetGenericTypeDefinition() == typeof (Dictionary<,>))
                    {
                        var arg1 = tagType.GetGenericArguments()[0];
                        var arg2 = genericArguments[0];
 
                        foreach (var value in e.Node.Tag as Dictionary<arg1, arg2 >)
                        {
                            AppendNodes(value, value.Key, value.Value, value.Value.GetType(), value.Value, e.Node);
                        }
                    }
меня интересовало как сделать так, чтобы динамически подставить нужные аргументы (типы) для Dictionary<arg1, arg2 >, преобразовав arg1 и arg2 в типы...
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
27.08.2019, 15:24
Цитата Сообщение от auskst Посмотреть сообщение
меня интересовало как сделать так, чтобы динамически подставить нужные аргументы (типы) для Dictionary<arg1, arg2 >, преобразовав arg1 и arg2 в типы...
Как аргументы могут быть динамическими если дальше идет статический код который требует строго определенных типов?
Или в AppendNodes второй и третий параметр из примера имеют тип object?
0
0 / 0 / 0
Регистрация: 22.10.2017
Сообщений: 55
27.08.2019, 15:27  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Как аргументы могут быть динамическими если дальше идет статический код который требует строго определенных типов?
Или в AppendNodes второй и третий параметр из примера имеют тип object?
C#
1
TreeListNode AppendNodes(object data, string nodeName, object nodeValue, Type nodeType, object tag, TreeListNode parentNode)
Но какое это имеет значение?
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
27.08.2019, 16:01
Цитата Сообщение от auskst Посмотреть сообщение
Но какое это имеет значение?
Предложенный код не гарантирует что value.Key который дальше передается в параметр nodeName, будет иметь тип string потому как нет никаких ограничений на тип arg1.

А еще есть такое понятие как ковариантность/контравариантность типов.
Приведение типов в c# сделано так чтобы гарантировать консистентность input/output параметров.
И например такой код не будет компилироваться
C#
1
2
var dictionary = new Dictionary<string, string>();
var objDictionary = dictionary as Dictionary<object, object>;
Потому что позже может написать
C#
1
objDictionary.Add(new object(), new object())
Что приводило бы к runtime ошибке т.к. objDictionary на самом деле является обьектом типа Dictionary<string, string> который гарантирует что Key, Value будут иметь тип string.

Можно использовать non generic интерфейс IDictionary который реализован в Dictionary<,>
Тогда можно читать из этого словаря, key и value будут приведены к object, но при попытке добавить в словарь несовместимый по типу обьект будет runtime error.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.08.2019, 16:01

Инициализация generic классов используя System.Type
Здравствуйте. Есть метод который возвращает через делегат имена свойств объекта и ссылку на сами свойства в виде object. ...

Получение свойств из Generic объекта
Всем привет. Есть generic класс: public class Wrapper&lt;T&gt; where T : Entity { public T Entity { get; set; } ...

Использование byte[] как generic-типа
Подскажите правильное направление в решении такой проблемы. Есть некий класс public class DataQueue&lt;T&gt; : IDisposable where T:...

Объявление обобщённого типа (Generic) для стандартных целочисленных типов
Здравствуйте. Есть класс для вычисления факториала: public class Factorial { long _digit; public...

Необработанное исключение типа "System.Net.Sockets.SocketException" в System.dll
Доброго времени суток! Есть следующая статья: Разработка прокси-сервера на C# В самом конце есть исходник с несколькими разными прокси...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru