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

Как создать экземпляр класса динамически?

31.08.2013, 01:16. Показов 5977. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый вечер всем, в c# я новичок поэтому сильно не ругайте за глупый вопрос
есть ряд классов
param1
param2
..
и так далее

и есть основной класс, в методе основного класса нужно обратиться к классу парам, но в этот метад передается цифра, как по ней создать экземпляр класса?

C#
1
2
3
4
void getParams (int index)
{
     param/*тут цифра*/  params = new param/*тут цифра*/();
}
как сделать аткую манипуляцию?
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.08.2013, 01:16
Ответы с готовыми решениями:

Как правильно создать экземпляр класса
Начал я обучение по майкрасофтовскому учебнику для школьников. До этого совсем немножко писал на Паскале и щас в инсте на Делфи. В...

Как мне создать экземпляр этого класса?
Господа, я не понимаю этот синтаксис С#... Как мне создать экземпляр этого класса? public class Importer { ...

Создать экземпляр метода класса или доступ к методу из экземпляра класса
Всем доброго времени суток!) Уже месяца как 2 не сишарпил и подзабыл...собственно задача такая: Создать отдельный экземпляр класса для...

31
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
04.09.2013, 19:08
Студворк — интернет-сервис помощи студентам
Хаха... то же самое только коряво и в профиль.
особенно это:
C#
1
2
3
                dictionaryCommandType.Add(ECommand.abc, typeof(Meth1));
                dictionaryCommandType.Add(ECommand.cdudhfjx, typeof(Meth2));
                dictionaryCommandType.Add(ECommand.lookfifofopddjfh, typeof(Meth1638));
то есть добавляете новый обработчик/класс - прописываете его в лоадере

зы. я Потому указал класс Packet потому что данные приходят в таком виде:
заголовок пакета { opcode : int, size : int }
тело пакета { byte[size] }

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

а то что вы заюзали енумы - так это дела не меняет.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
04.09.2013, 21:07
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
 
namespace Test
{
    internal enum EOpCode
    {
        None = 0,
        OpCode1 = 1,
        OpCode2 = 2,
        OpCode3 =3
    }
 
    class Program
    {
        public interface ICommand
        {
            void Command();
        }
 
        public interface IMapping<T>
        {
            void Mapping(T data);
        }
 
        public class Pack1:ICommand, IMapping<byte[]>
        {
            public void Command()
            {
                Console.WriteLine(Data);
            }
 
            public void Mapping(byte[] data)
            {
                // конверсия массива байт в внутрение поля класса
                Data = Encoding.UTF8.GetString(data);
            }
 
            public string Data { get; set; }
        }
 
        public class Pack2 : ICommand, IMapping<byte[]>
        {
            public void Command()
            {
                Console.WriteLine(Data);
            }
 
            public void Mapping(byte[] data)
            {
                // конверсия массива байт в внутрение поля класса
                Data = Encoding.UTF8.GetString(data);
            }
 
            public string Data { get; set; }
        }
 
        public class Pack3 : ICommand, IMapping<byte[]>
        {
            public void Command()
            {
                Console.WriteLine(Data);
            }
 
            public void Mapping(byte[] data)
            {
                // конверсия массива байт в внутрение поля класса
                Data = Encoding.UTF8.GetString(data);
            }
 
            public string Data { get; set; }
        }
 
        public static class FabricClass
        {
            static Dictionary<EOpCode, Type> dictionaryCommandType = new Dictionary<EOpCode, Type>(); 
            
            static FabricClass() 
            {
                dictionaryCommandType.Add(EOpCode.OpCode1, typeof(Pack1));
                dictionaryCommandType.Add(EOpCode.OpCode2, typeof(Pack2));
                dictionaryCommandType.Add(EOpCode.OpCode3, typeof(Pack3));
            }
 
            public static ICommand GetInstance(byte[] pack)
            {
                int opCode = BitConverter.ToInt32(pack, 0);
                int sizeCommand = BitConverter.ToInt32(pack, sizeof(int));
                byte[] command = new byte[sizeCommand];
                Array.Copy(pack,2*sizeof(int), command, 0, sizeCommand);
                var mapping = (IMapping<byte[]>)Activator.CreateInstance(dictionaryCommandType[(EOpCode)opCode]);
                mapping.Mapping(command);
                return (ICommand) mapping;
            }
        }
 
        static void Main(string[] args)
        {
            byte[] pack1 = GenerateData(1, "Это - Pack1");
            byte[] pack2 = GenerateData(2, "Это - Pack2");
            byte[] pack3 = GenerateData(3, "Это - Pack3");
            var command1 = FabricClass.GetInstance(pack1);
            var command2 = FabricClass.GetInstance(pack2);
            var command3 = FabricClass.GetInstance(pack3);
            command1.Command();
            command2.Command();
            command3.Command();
            Console.ReadLine();
        }
 
        private static byte[] GenerateData(int opCode, string data)
        {
            byte[] dataBytes = Encoding.UTF8.GetBytes(data);
            byte[] sizeBytes = BitConverter.GetBytes(dataBytes.Length);
            byte[] opCodeBytes = BitConverter.GetBytes(opCode);
            byte[] result = new byte[opCodeBytes.Length + sizeBytes.Length + dataBytes.Length];
            Array.Copy(opCodeBytes, 0, result, 0, sizeof(int));
            Array.Copy(sizeBytes, 0, result, sizeof(int), sizeof(int));
            Array.Copy(dataBytes, 0, result, 2 * sizeof(int), dataBytes.Length);
            return result;
        }
 
    }
}
И так тоже не верно? :-D, юноша не городите чепухи, я вам еще раз повторюсь ЛЮБОЙ НАБОР БАЙТ это паттерн "команда" вопрос лишь в том как вы расшифровываете эти байты - т. е. все зависит от того как вы реализовали адаптер из массива байт к объектной модели, а все ваши Оп. Коды и атрибуты связные с ними можете выкинуть на свалку как пережиток страшного процедурного прошлого, и да 10000 различных команд для протокола многовато, выделяйте супер классы, классы, и подклассы команд в вашем протоколе, тогда и жить будет легче
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
04.09.2013, 21:26
ЗЫ.

Не по теме:

Не по теме:

Не по теме:

Не по теме:

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



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

хех... дискуссия приостановлена, до тех пор пока вы не научитесь читать.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.09.2013, 23:13
агерон, А по идее тут нужно было просто использовать switch...
и вы все таки будете утверждать что любой "пакет" нельзя адаптировать под паттерн "Команда"?
все что угодно можно привести к чему угодно.

В общем, очевидны симптомы паттерна головного мозга, иногда это лечится.
ЛЮБОЙ НАБОР БАЙТ это паттерн "команда"
можно в подпись поставить
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
05.09.2013, 01:36
Psilon, а ты пожалуйста не вырывай слова из контекста, про массив байт я говорил в контексте принятых пакетов, а насчет ооп головного мозга... почитай пожалуйста исходники NopCommerce, да попробуй в них добавить корректно новую функциональность вот тогда и посмотрю как ты запоешь на счет необходимости/не нужности паттернов, учите классиков господа.

Konctantin, а ты пожалуйста выучи что такое ООП и научись им пользоваться, а потом будешь говорить что то в свою защиту, простейшей цепочки Пакет -> команда -> под команда проработать не можешь, [сарказм]зачем нам протокол обмена анализировать и выделять общее мы сразу все 10000 команд зафигачим[/сарказм]

P. S. даю 95% что все 10000 команд твоего протокола прекрасно расписаны в каком либо rfc или техническом документе, и там их явно намного меньше 10000 :-D
0
 Аватар для n1l
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
05.09.2013, 06:28
Цитата Сообщение от czp Посмотреть сообщение
добрый вечер всем, в c# я новичок поэтому сильно не ругайте за глупый вопрос
Расскажите подробнее о задаче, что вы хотите сделать в конечном итоге?
Есть способ проще чем те, которые предложили другие люди, если я правильно понимаю задачу. Но что бы убедится, расскажите пожалуйста чуть больше о том, что вы хотите сделать.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.09.2013, 13:29
Цитата Сообщение от агерон Посмотреть сообщение
насчет ооп головного мозга... почитай пожалуйста исходники NopCommerce, да попробуй в них добавить корректно новую функциональность вот тогда и посмотрю как ты запоешь на счет необходимости/не нужности паттернов, учите классиков господа.
во-первых про ООП ты сам придумал. А во вторых... неумение понимать, когда паттерны применять ВРЕДНО свойственно многим, которые мнят себя "просвещенными"...

Вот пример неумного использования паттернов:
http://habrahabr.ru/post/153225/

А вот как следовало писать:
http://stdray.livejournal.com/74041.html
1
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
05.09.2013, 16:07
Psylon, не будь таким умным, и хабр читаю, и про выпечку хлеба знаю, ценность паттернов не в том что ты о них знаешь или применяешь, а в том что это стандартные подходы, решения, стандартных задач, и поверь мне я лучше напишу код который мне сгенерирует 10000 классов реализаций шаблонна "команда", чем ручками напишу 1 "божественный" класс с 10000 функций, хватит уже пару раз переписывал куски кода по 15-20 тысяч строк в 3-4 тысячи, но это если в лоб решать задачу, а если немного подумать то можно понять что во всех этих 10000 спокойно можно выделить

1) Пакеты комманд
2) внутри пакетов сами команды
3) внутри комманд подкоманды

и поверь такое 3-х уровневое логическое дерево спокойно позволит снизить сложность кода в 10 а то и 100 раз

P. S. про свой опыт скромно промолчу, скажу лишь одно начинал я с x386, и тоже в свое время писал процедурные простыни с goto на бейсеке

P. P. S. и да про ООП ты может и знаешь но учитывая что так трепетно защищаешь процедурный подход, из процедурного программирования ты так и не выбрался
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
05.09.2013, 16:53
сгенерирует 10000
еще раз, научитесь читать, я писал 1000 а не 10000.
Если вам так неимется, пореверсите протокол передачи данных MMORPG (Star Wars, Guild Wars 2, World of WarCraft) и увидите сколько там различных пакетов. и сколько там извращений. Посмотрим как вы с вашим подходом ее решите.
1) Пакеты комманд
2) внутри пакетов сами команды
3) внутри комманд подкоманды

и поверь такое 3-х уровневое логическое дерево спокойно позволит снизить сложность кода в 10 а то и 100 раз
окей, давайте посмотрим на вашем примере и паре пакетов из wow/

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[WowPacketParser(WowOpcodes.SMSG_CAST_FAILED)]
internal sealed class CastFailedParser : WowPacketParser
{
    protected override PacketGroups WowGroup { get { return PacketGroups.Spells; } }
 
    protected override void InternalParse()
    {
        Output.AppendLine("Cast Id: " + Reader.ReadByte());
        Output.AppendLine("Spell Id: " + Reader.ReadUInt32());
        Output.AppendLine("Reason: " + (SpellFailedReason)Reader.ReadByte());
 
        if (!Reader.IsRead)
            Output.AppendLine("Value 1: " + Reader.ReadUInt32());
 
        if (!Reader.IsRead)
            Output.AppendLine("Value 2: " + Reader.ReadUInt32());
    }
}
есть такие
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
[WowPacketParser(WowOpcodes.SMSG_LFG_PLAYER_INFO)]
internal sealed class LfgPlayerInfoParser : WowPacketParser
{
    protected override PacketGroups WowGroup { get { return PacketGroups.LookingForGroup; } }
 
    protected override void InternalParse()
    {
        byte count = Reader.ReadByte();
        Output.AppendLine("Total Dungeons: " + count);
        for (byte i = 0; i < count; ++i)
        {
            Output.AppendLine();
            Output.AppendLine("  Dungeon: " + new DungeonEntry(Reader.ReadUInt32()) + "   Done: " + Reader.ReadByte());
            Output.AppendLine("  Money: " + new Money(Reader.ReadUInt32()) + " XP: " + Reader.ReadUInt32()
                + " VarMoney: " + new Money(Reader.ReadUInt32()) + " VarXP: " + Reader.ReadUInt32());
            Output.AppendLine("  Money: " + new Money(Reader.ReadUInt32()) + " XP: " + Reader.ReadUInt32()
                + " VarMoney: " + new Money(Reader.ReadUInt32()) + " VarXP: " + Reader.ReadUInt32());
            Output.AppendLine("  Money: " + new Money(Reader.ReadUInt32()) + " XP: " + Reader.ReadUInt32()
                + " VarMoney: " + new Money(Reader.ReadUInt32()) + " VarXP: " + Reader.ReadUInt32());
            Output.AppendLine("  Unk: " + Reader.ReadByte());
 
            for (byte j = 0; j < 3; ++j)
            {
                uint role = Reader.ReadUInt32();
                Output.AppendLine("  Role: " + (GroupRoles)role);
                if (role != 0)
                {
                    Output.AppendLine("    Money Reward: " + new Money(Reader.ReadUInt32()));
                    Output.AppendLine("    Xp Reward: " + Reader.ReadUInt32());
                    byte count2;
                    Output.AppendLine("    Rewards: " + (count2 = Reader.ReadByte()));
                    for (byte k = 0; k < count2; ++k)
                    {
                        Output.AppendFormatLine("     Item: {0}  DisplayId: {1}  Count: {2} IsCurrency (Cata): {3}",
                            Reader.ReadUInt32(), Reader.ReadUInt32(), Reader.ReadUInt32(), Reader.ReadByte());
                    }
                }
            }
 
            Output.AppendLine("  Basic Money Reward: " + new Money(Reader.ReadUInt32()));
            Output.AppendLine("  Basic XP Reward: " + Reader.ReadUInt32());
            byte count3 = Reader.ReadByte();
            Output.AppendLine("  Basic Rewards: " + count3);
            for (byte j = 0; j < count3; ++j)
            {
                Output.AppendFormatLine("     Item: {0}  DisplayId: {1}  Count: {2} IsCurrency (Cata): {3}",
                    Reader.ReadUInt32(), Reader.ReadUInt32(), Reader.ReadUInt32(), Reader.ReadByte());
            }
        }
 
        uint locks = Reader.ReadUInt32();
        Output.AppendLine("Total Locks: " + locks);
        for (uint j = 0; j < locks; ++j)
        {
            Output.AppendLine("  Dungeon: " + new DungeonEntry(Reader.ReadUInt32()));
            Output.AppendLine("  Lock: " + (LFGLockStatusType)Reader.ReadUInt32());
            Output.AppendFormatLine("  Additional: Entrance Area Id: {0} {1}", Reader.ReadUInt32(), Reader.ReadUInt32());
            Output.AppendLine();
        }
    }
}
а есть и такие:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[WowPacketParser(WowOpcodes.SMSG_SEND_ALL_COMBAT_LOG)]
[WowPacketParser(WowOpcodes.SMSG_SPELLENERGIZELOG)]
[WowPacketParser(WowOpcodes.SMSG_SPELLBREAKLOG)]
[WowPacketParser(WowOpcodes.SMSG_SPELLLOGEXECUTE)]
[WowPacketParser(WowOpcodes.SMSG_SPELLLOGMISS)]
[WowPacketParser(WowOpcodes.SMSG_SPELLHEALLOG)]
[WowPacketParser(WowOpcodes.SMSG_SPELLNONMELEEDAMAGELOG)]
[WowPacketParser(WowOpcodes.SMSG_PERIODICAURALOG)]
[WowPacketParser(WowOpcodes.SMSG_LOG_XPGAIN)]
internal sealed class CombatLogParser : WowPacketParser
{
    protected override PacketGroups WowGroup { get { return PacketGroups.CombatLog; } }
 
    protected override void InternalParse()
    {
        Parse((WowOpcodes)Packet.Opcode);
    }
 
    private void Parse(WowOpcodes opcode)
    {
и это без извратов с компрессией и чтением значений по битмаске, и самого BitStream.
Итого в данном случае чтобы добавить новый обработчик, достаточно создать новый класс пометить атрибутами и поместить его в проект. При этом ничего нигде не прописывая.

и еще одно скажите, где вы тут видите процедурность? или предпочитаете налепить кучу классов а потом в свитче их вызывать?

А теперь еще раз вернемся к нашим баранам и вашим "тараканам": с чего вы взяли, что в ваш приведенный код блещет "патернами и ООП"

И хотелось бы посмотреть. какие патерны и фабрики вы бы применили к этому делу, чтобы это выглядело более ООПшней и Патерней чем есть. Ужас как хочу это увидеть.
0
05.09.2013, 18:28
 Комментарий модератора 
Господа. Думаю, самое время перестать выяснять кто круче и вернуться к теме - то есть, к сообщению ТС.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
05.09.2013, 19:28
3 класса которые вырваны из контекста, прекрасно.... ты уж будь так любезен выложи полностью проект тогда и обсудить можно
0
05.09.2013, 20:54
 Комментарий администратора 
ТС к теме интереса не проявляет.
тема переросла в выяснение у кого длиннее...
закрыто.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.09.2013, 20:54
Помогаю со студенческими работами здесь

Создать экземпляр неизвестного класса
Есть немношко кода: ./AbstractProgram.cs using System; namespace patterns { abstract public class AbstractProgram { ...

Создать экземпляр класса в зависимости от swich
Примерно такой код private enum HashAlgorithm { SHA1, SHA256, SHA384, SHA512, RIPEMD160, MD5} switch (algorithm) { ...

Ошибка: Невозможно создать экземпляр абстрактного класса
class Program { static void Main(string args) { List&lt;Prog&gt; listSoft = new List&lt;Prog&gt;(); //массив...

Экземпляр класса как входные данные метода другого класса
Можно ли в качестве входных данных метода передать экземпляр метода другого класса? Если да, то как?

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


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

Или воспользуйтесь поиском по форуму:
32
Закрытая тема Создать тему
Новые блоги и статьи
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru