C #, вызывая экземпляр класса из строки - PullRequest
0 голосов
/ 12 апреля 2011

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

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

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

        StandardVehicle VauxhallB = new StandardVehicle();
        VauxhallB.Model = "B";
        VauxhallB.Manufacturer = "Vauxhall";
        VauxhallB.Doors = 5;
        VauxhallB.HorsePower = 200;
        VauxhallB.Transmission = "Manual";
        VauxhallB.Year = 2009;
        VauxhallB.Cylinders = 6;
        VauxhallB.Seats = 7;
        VauxhallB.Price = 17000;
        VauxhallB.Registration = "abc1243";

        StandardVehicle objname = comboBox1.Text;

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

Любая помощь будет оценена.

С уважением, S.

Ответы [ 6 ]

4 голосов
/ 12 апреля 2011

Нет, это не просто форматирование строки.Звучит так, как будто вы хотите

Dictionary<string, StandardVehicle>

Заполните его, чтобы отобразить из строк в объекты, затем найдите объект, соответствующий имени, данному пользователем.

1 голос
/ 12 апреля 2011

Нельзя преобразовать строку в объект, если у вас нет

  1. Конструктор, который принимает строку и создает необходимый объект
  2. Явный / неявный оператор приведения

и другой параметр

Использовать Activator.CreateInstace

3-й параметр действителен, только если строка содержит правильное имя типа, для вашего примера вы можете сделать

Type type = Type.GetType(comboBox1.Text);
StandardVehicle objname = Activator.CreateInstace(type);

, это будет работатьесли comboBox1.Text == "StandardVehicle".

Больше информации здесь:

http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx

http://msdn.microsoft.com/en-us/library/wccyzw83.aspx

1 голос
/ 12 апреля 2011

VauxhallB это просто символ для компьютера.Пользователь не должен ссылаться на имена ваших переменных - хотя, возможно, это можно сделать с помощью отражения, но это сложный аспект программирования.

Лучший способ сделать это - связать каждый экземпляр сСтрока "имя" в Dictionary<string, StandardVehicle>, и посмотрите с этим.Что-то вроде:

Dictionary<string, StandardVehicle> nameMap = new Dictionary<string, StandardVehicle>();
nameMap["VauxhallB"] = VauxhallB;
StandardVehicle objname = nameMap[comboBox1.Text];

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

0 голосов
/ 12 апреля 2011

Это немного сложнее, чем ваш образец.Я собираюсь начать с быстрого и легкого подхода, который, хотя и является быстрым и легким, является своего рода анти-паттерном, но я объясню это в конце:

IBritishAuto car;

switch
{
    case "Vauxhall":
    {
        car = new Vauxhall(standardVehicle);    
        break;
    }
    case "Jaguar":
    {
        car = new Jaguar(standardVehicle);
    }
    ...etc.
}

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

Все еще там?

Этот шаблон называется «условный диспетчер».Есть две основные стратегии для его улучшения: рефакторинг в шаблон Command (который ограничен, потому что это шаблон Gang of Four) или более широкая реализация концепции под названием «инверсия управления».Если вам интересно, вот ваши условия Google:

"рефакторинг условного диспетчера" "инверсия управления".

Удачи.

0 голосов
/ 12 апреля 2011

Сначала я также подумал, что вы имеете в виду рефлексию, но вы хотите всегда использовать свой класс StandardVehicle.Просто свойства должны быть установлены единственной строкой, которую вы получаете от пользователя.

Напишите себе конструктор.Вы определяете формат отдельной строки, например, фиксированное положение в этой строке:

public StandardVehicle(String data)
{
    this.Model = data.Substring(0, 1);
    this.HorsePower = Int32.Parse(data.Substring(1, 4);
}

Не очень удобно, но может работать.Добавьте немного обработки ошибок.Или загрузка XML или другие форматы.

0 голосов
/ 12 апреля 2011

Попробуйте это:

StandardVehicle selectedObject = (StandardVehicle)comboBox1.SelectedItem;

Конечно, ваш comboBox должен быть привязан к коллекции StandardVehicles ... Если это не так, тогда выберите словарь, как уже предлагалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...