Лучший отвечающий
строка->класс

Вопрос
-
Здравствуйте, я не знаю как выразить свою мысль, но идея следующая, и нужна помощь в реализации:
есть множество классов, типа aa_ru, ab_ru, ac_ru ... aa_en, ab_en ... они схожы между собой
данные из формы в форму передается в виде строки, а в частности передается "aa_ru"
во второй форме для универсальности нужно
"aa_ru" сс = new "aa_ru"()
мм.. скажем так, преобразовать значение строки в название класса
через switch () делать не хочется, слишком много классов
может написана глупость, но все же (я пока все еще в процессе познания языка)- Изменен тип Abolmasov Dmitry 24 апреля 2012 г. 8:34
24 апреля 2012 г. 6:04
Ответы
-
Добрый день.
2. Create an object knowing only the class name? (как создать объект зная только имя класса)
А извиняться не за что, все когда то с чего то начинали :)
- Изменено Alexandr Gashper 24 апреля 2012 г. 6:23
- Помечено в качестве ответа Abolmasov Dmitry 24 апреля 2012 г. 8:34
- Снята пометка об ответе Abolmasov Dmitry 24 апреля 2012 г. 8:41
- Помечено в качестве ответа Abolmasov Dmitry 25 апреля 2012 г. 13:14
24 апреля 2012 г. 6:22 -
Можно попробовать использовать dynamic.
dynamic cc = Activator.CreateInstance(t); Console.WriteLine(cc.str11[1, 1]);
В этом случае конкретный тип cc будет определяться в процессе выполнения.
Однако, и Activator.CreateInstance, и dynamic, и вышеупомянутая рефлексия - работают очень медленно. Поэтому применять их можно только в некритичных к производительности местах программы.
Вообще, стоит пересмотреть архитектуру приложения. Явно что-то делается не так, что понадобились такие способы создания объектов. Вероятно, как сказал Дмитрий, нужно все классы унаследовать от одного базового.
- Помечено в качестве ответа Abolmasov Dmitry 25 апреля 2012 г. 13:14
24 апреля 2012 г. 9:56
Все ответы
-
Добрый день.
2. Create an object knowing only the class name? (как создать объект зная только имя класса)
А извиняться не за что, все когда то с чего то начинали :)
- Изменено Alexandr Gashper 24 апреля 2012 г. 6:23
- Помечено в качестве ответа Abolmasov Dmitry 24 апреля 2012 г. 8:34
- Снята пометка об ответе Abolmasov Dmitry 24 апреля 2012 г. 8:41
- Помечено в качестве ответа Abolmasov Dmitry 25 апреля 2012 г. 13:14
24 апреля 2012 г. 6:22 -
оказалось то что нужно, спасибоType t = Type.GetType("Namespace." + parametr);
object cc = Activator.CreateInstance(t);
содержимое класса "подтянулось"- Помечено в качестве ответа Abolmasov Dmitry 25 апреля 2012 г. 13:14
- Снята пометка об ответе Abolmasov Dmitry 25 апреля 2012 г. 13:14
24 апреля 2012 г. 7:04 -
А зачем вам столько классов?24 апреля 2012 г. 7:22
-
вполне вероятно что есть и другой вариант не использовать их
public class aa_ru
{
public string[,] str11 = new string[2, 4] {
{"значение1_1", "значение1_2", "значение1_3","значение1_4"},
{"значение2_1", "значение2_2", "значение2_3","значение2_4"},
};
public string[,] str12 = new string[2, 4] {
{"значение1_1", "значение1_2", "значение1_3","значение1_4"},
{"значение2_1", "значение2_2", "значение2_3","значение2_4"},
};
}
public class ab_ru
{
public string[,] str11 = new string[2, 4] {
{"значение1_1", "значение1_2", "значение1_3","значение1_4"},
{"значение2_1", "значение2_2", "значение2_3","значение2_4"},
};
public string[,] str12 = new string[2, 4] {
{"значение1_1", "значение1_2", "значение1_3","значение1_4"},
{"значение2_1", "значение2_2", "значение2_3","значение2_4"},
};
}
...
ну типа в зависимости от выбранного значения подтягиваются разные значения
object cc = Activator.CreateInstance(t); //:( подтягиваются во время трассировки
а если обратиться
сс.str11[1,1]; //компилятор ругается, рано радовался
- Изменено jericho13 24 апреля 2012 г. 8:07
24 апреля 2012 г. 8:06 -
Тогда вам нужно либо все классы унаследовать от базового, который бы содержал нужные поля, которые будут у всех потомков. Приводить объект, который получился от Activator к базовому классу и использовать доступные поля.
Либо смотреть в сторону рефлексии нужно
Для связи [mail]
24 апреля 2012 г. 8:41 -
Можно попробовать использовать dynamic.
dynamic cc = Activator.CreateInstance(t); Console.WriteLine(cc.str11[1, 1]);
В этом случае конкретный тип cc будет определяться в процессе выполнения.
Однако, и Activator.CreateInstance, и dynamic, и вышеупомянутая рефлексия - работают очень медленно. Поэтому применять их можно только в некритичных к производительности местах программы.
Вообще, стоит пересмотреть архитектуру приложения. Явно что-то делается не так, что понадобились такие способы создания объектов. Вероятно, как сказал Дмитрий, нужно все классы унаследовать от одного базового.
- Помечено в качестве ответа Abolmasov Dmitry 25 апреля 2012 г. 13:14
24 апреля 2012 г. 9:56 -
Если судить по примеру кода, то у вас классы даже набором данных неотличаются;))Зачем вы выносите массивы в отдельный класс?"en" в имени класса aa_en подразумевает, что будет возвращаться массивстрок на английском?Данные в в этих классах во время выполнения не меняются?24 апреля 2012 г. 11:39
-
Если судить по примеру кода, то у вас классы даже набором данных неотличаются;))Зачем вы выносите массивы в отдельный класс?"en" в имени класса aa_en подразумевает, что будет возвращаться массивстрок на английском?Данные в в этих классах во время выполнения не меняются?
ок, представим что это небольшой каталог машин, en и ru , это зарубежные и наши
public class vaz21099_ru
{
public string[] kuzov = new string[4] {"значение1_1", "значение1_2", "значение1_3","значение1_4"};
public string[] dvigatel = new string[3] {"значение1_1", "значение1_2", "значение1_3"};
};
Все остальные классы схожы, количество наборов массивов не имеет значение, возможно и больше, но во всех классах одинаковы
Во время выполнения данные не меняются
- Изменено jericho13 25 апреля 2012 г. 4:07
25 апреля 2012 г. 4:06 -
Изучайте основы ООП.
Все делается намного элементарнее, чем у вас реализовано.
- Предложено в качестве ответа Viktor Borisov 25 апреля 2012 г. 4:44
25 апреля 2012 г. 4:44 -
да я в принципе понимаю что элементарнее, но мысль в голову не лезет, может примерчик? ^_^25 апреля 2012 г. 5:11
-
public class Car { public string Name {get;set;} public string Country {get;set;} public CarEngine Engine {get;set;} public CarModel Model {get;set;} ... } pubilc class CarEngine { public string Name {get;set;} ... } public class CarBrand { public string Name{get;set;} ... } public class CarModel { public string Model {get;set;} public CarBrand Brand {get;set;} ... }
Это первое, что пришло в голову. Вариации могут быть разные и зависят от конкретной задачи.
- Изменено Viktor Borisov 25 апреля 2012 г. 5:23
25 апреля 2012 г. 5:20 -
пришлось пересмотреть структуру приложения на основе http://msdn.microsoft.com/ru-ru/library/bb384087.aspx27 апреля 2012 г. 3:05