locked
строка->класс RRS feed

  • Вопрос

  • Здравствуйте, я не знаю как выразить свою мысль, но идея следующая, и нужна помощь в реализации:
    есть множество классов, типа aa_ru, ab_ru, ac_ru ... aa_en, ab_en ... они схожы между собой
    данные из формы в форму передается в виде строки, а в частности передается "aa_ru"
    во второй форме для универсальности нужно
    "aa_ru" сс = new "aa_ru"()

    мм.. скажем так, преобразовать значение строки в название класса

    через switch () делать не хочется, слишком много классов

    может написана глупость, но все же (я пока все еще в процессе познания языка)
    24 апреля 2012 г. 6:04

Ответы

  • Добрый день.

    1. Activator - класс

    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

Все ответы

  • Добрый день.

    1. Activator - класс

    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;}
    ...
    }
    Это первое, что пришло в голову. Вариации могут быть разные и зависят от конкретной задачи. 


    25 апреля 2012 г. 5:20
  • пришлось пересмотреть структуру приложения на основе http://msdn.microsoft.com/ru-ru/library/bb384087.aspx
    27 апреля 2012 г. 3:05