Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135

Создать массив, в котором будут хранится названия / типы классов

14.04.2015, 01:57. Показов 2286. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно, вот в чем задача, есть некоторые классы реализовывающие интерфейс IPacket.
Нужно завести массив, в котором будут хранится названия / типы классов. Затем нужно создать конкретный экземпляр объекта определенного класса, класс определяется по индексу в массиве.
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
using System;
 
namespace ClassLibrary1
{
    public interface IPacket
    {
        void DoSomething();
    }
 
    public class Class0 : IPacket
    {
        public void DoSomething() { }
    }
 
    public class Class1 : IPacket
    {
        public void DoSomething() { }
    }
 
    public class Program
    {
        public static IPacket[] IPacketList = {Class0, Class1}; // Сохраняем все допустимые классы реализовывающие интерфейс IPacket.
        public static int Main(string[] args)
        {
            IPacket somePacket = new IPacketList[0](); //Создаем экземпляр объекта класса.
            return 0;
        }
    }
}
Можно сделать нечто подобное или использовать свитч?

Добавлено через 14 минут
Так вполне нормально?
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
using System;
 
namespace ClassLibrary1
{
    public interface IPacket
    {
        void DoSomething();
    }
 
    public class Class0 : IPacket
    {
        public void DoSomething() { }
    }
 
    public class Class1 : IPacket
    {
        public void DoSomething() { }
    }
 
    public class Program
    {
        public static System.Type[] IPacketList = { typeof(Class0), typeof(Class1) };
        public static int Main(string[] args)
        {
            IPacket somePacket = Activator.CreateInstance(IPacketList[0]) as IPacket;
            return 0;
        }
    }
}
Или может не стоит страдать этим?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.04.2015, 01:57
Ответы с готовыми решениями:

Создать двумерный массив, в котором индексами будут основания степеней, а значения будут значениями степеней чисел
Доброго времени суток, помогите пожалуйста: Нужно создать двумерный массив, в котором индексы будут обозначать основания степеней от 2...

Можно ли создать массив в котором с 0 по 4 элемент будут храниться double, с 5 по 9 будут храниться int и т.д.?
Такой вопрос: я хочу создать одномерный массив в котором с 0 по 4 элемент будут храниться double, с 5 по 9 будут храниться bool, с 10 по 14...

Создать массив 5 на 5 в котором числа будут от 1 до 12 и повторятся по 2 раза
Помогите создать массив 5 на 5 в котором числа будут от 1 до 12 и повторятся по 2 раза помогите плиз заранее спасибо!

6
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
14.04.2015, 02:41
Ну если тебе важен определённый порядок создания экземпляров, можно и так. Но мне это напоминает масло масляное
0
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135
14.04.2015, 10:23  [ТС]
Ну, просто у меня, по идее, будет множество классов / структур реализовывающих один и тот же интерфейс, они будут запаковываться и распаковываться в массив байтов, соответственно массив типов нужен для назначения уникального id для распознавания класса. Это рационально или можно как-то по другому?
0
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
14.04.2015, 10:37
PVD,
Как вариант
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
    public interface IPacket { }
 
    class Packet1 : IPacket { }
 
    class Packet2 : IPacket { }
 
    struct Packet3 : IPacket { }
 
    public class Creator
    {
        public static IPacket CreatePacket(string name)
        {
            switch (name)
            {
                case "Packet1":
                    return new Packet1();
                case "Packet2":
                    return new Packet2();
                case "Packet3":
                    return new Packet3();
                default:
                    throw new ArgumentException();
            }
        }
    }
0
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135
14.04.2015, 10:43  [ТС]
XRoy,
Просто у меня их может быть до сотни, я думаю, пихать в переключатель не лучшая идея, возможно, оптимальнее будет создать массив делегатов и при получении определенного пакета создавать пакет определенного класса и вызывать привязанные к делегату функции?
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
using System;
using System.Net;
using System.Net.Sockets;
 
namespace FenixCore.Net.Packets
{
    /// <summary>
    /// Класс для передачи и получения пакетов.
    /// </summary>
    public class PacketController
    {
        /// <summary>
        /// Делегат для хранения ссылок на функции, которое будут вызывается при получении определенного пакета.
        /// </summary>
        /// <param name="packet">Полученный пакет.</param>
        public delegate void PacketRecievedEvent(IPacket packet);
 
        /// <summary>
        /// Список всех существующих пакетов, для задания уникального номера каждому пакету.
        /// </summary>
        public static System.Type[] PacketList { get; private set; }
        /// <summary>
        /// Список событий для каждого из зарегистрированных пакетов.
        /// </summary>
        public PacketRecievedEvent[] PacketsEventList { get; private set; }
 
        /// <summary>
        /// Сокет, который используется для передачи и получения пакетов.
        /// </summary>
        public Socket Connection { get; set; }
 
        /// <summary>
        /// Статический конструктор, указывает пакеты для работы и регистрирует их.
        /// </summary>
        static PacketController()
        {
            
            PacketList = null; // PacketList = {typeof(SomePacket0), ... typeof(SomePacketN)};
        }
 
 
        /// <summary>
        /// Создает пустой список событий для каждого из зарегистрирвоаных пакетов.
        /// </summary>
        public PacketController()
        {
            PacketsEventList = new PacketRecievedEvent[PacketList.Length];
        }
 
        /// <summary>
        /// Отправляет пакет удаленной библиотеке.
        /// </summary>
        /// <param name="packet">Структура отправляемого пакета.</param>
        public void Send(IPacket packet)
        {
            if (Connection != null)
                Connection.Send(packet.Write());
        }
 
        /// <summary>
        /// Получает пакеты от удаленной библиотеки и вызывает события связанные с каждым из типов пакетов.
        /// </summary>
        public void Recieve()
        {
            if (Connection != null)
            {
                int offset = 0;
                byte[] buffer = new byte[4096];
                int size = Connection.Receive(buffer);
                if (size > 0)
                    while (offset < size)
                    {
                        byte packetID = buffer[offset];
                        offset++;
                        if (packetID < PacketList.Length)
                        {
                            IPacket newPacket = Activator.CreateInstance(PacketList[packetID]) as IPacket;
                            offset += newPacket.Read(buffer, offset);
                            PacketsEventList[packetID](newPacket);
                        }
                        else
                            break; // Тут должна быть вызвана либо ошибка, ли сообщение, что был получен пакет с неизвестным номером.
                    }
            }
        }
    }
}
0
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
14.04.2015, 11:12
Лучший ответ Сообщение было отмечено PVD как решение

Решение

PVD,
Достаточно хранить тип, а по нему уже создавать объект
Вместе массива, лучше использовать словарь, id же могут быть и не последовательными числами

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
    public interface IPacket { }
 
    class Packet1 : IPacket { }
 
    class Packet2 : IPacket { }
 
    struct Packet3 : IPacket { }
 
    public class Creator
    {
        private static readonly Dictionary<int, Type> dict;
 
        static Creator()
        {
            dict = new Dictionary<int, Type>
            {   
                {1, typeof (Packet1)}, 
                {742, typeof (Packet2)}, 
                {1025, typeof (Packet3)}
            };
        }
 
        public static IPacket CreatePacket(int id)
        {
            if (dict.ContainsKey(id))
            {
                return (IPacket) Activator.CreateInstance(dict[id]);
            }
            
            throw new ArgumentException();
        }
    }
Создать объект можно будет просто
C#
1
Creator.CreatePacket(id);
1
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135
14.04.2015, 14:51  [ТС]
Хм, ясно, спасибо.

Добавлено через 3 часа 36 минут
А вот такой вопрос, если я хочу создать словарь из типов и делегатов, то как мне его задать?
C#
1
2
public delegate void PacketRecievedEvent(Packet packet, Object sender);
        public readonly Dictionary<Type, PacketRecievedEvent> PacketEvents;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2015, 14:51
Помогаю со студенческими работами здесь

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

Создать массив n на n-1, в котором будут записаны расстояния от одной точки до других
Здравствуйте. Помогите найти ошибку в коде. Мне на вход подается число n - число точек. Надо создать массив n на n-1, в котором будут...

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

Строка: Создать массив строк, в котором будут содержаться буквы вашего имени и фамилии...
Всем привет. Очень нужна помощь про одномерный массив. Есть задача: Создать одномерный массив строк, в котором будут содержаться...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru