Как динамически подставить класс - PullRequest
1 голос
/ 15 июля 2011

У меня есть динамический список автомобилей.Каждый тип определенных параметров конфигурации для редактирования данных требует различных форм.

пример:

тип tt77, tt90 - используется класс CarsTT d8080 - используется класс Carsd8080 d8797 - также использует этот класс, но с разнымизатор.

Это может быть как этот автомат, или я всегда должен использовать ПЕРЕКЛЮЧАТЕЛЬ

foreach (var item in Cars)
{
    switch (item.Key)
    {
        case "tt77":
            {
                ConfigClasses.Add(
                    item.Key, 
                    new CarsTT(item.Value, item.Value, "", "start"));
            } break;
        case "tt90":
            {
                ConfigClasses.Add(
                    item.Key, 
                    new CarsTT(item.Value, item.Value, "", "start"));
            } break;
        case "d8080":
            {
                ConfigClasses.Add(
                    item.Key, 
                    new Carsd8080(null, new List<string[]>()));
            } break;
        case "d8797":
            {
                ConfigClasses.Add(
                    item.Key, 
                    new Carsd8080(item.Value));
            } break;
        default: break;
    }

}

Ответы [ 3 ]

0 голосов
/ 15 июля 2011

Вы всегда можете создать:

SortedDictionary <string, ConstructorInfo> factory;

и затем сделайте:

ConfigClasses.Add (item.Key, factory [item.Key].Invoke ());

но у вас есть конструкторы, которые принимают разные списки параметров. Это проблема. Вы должны иметь один и тот же конструктор для каждого типа 1 . Вы можете упаковать все возможные параметры в один объект и передать его в качестве параметра конструктора, затем конструктор извлекает из объекта все, что ему нужно.

Примечания:

  1. Это не совсем так, вы можете сделать так, чтобы вызов Invoke содержал необходимые данные для конструктора - тип ConstructorInfo содержит список всех типов параметров.
0 голосов
/ 15 июля 2011

Здесь можно использовать полиморфизм, если количество типов жестко задано и не изменится.Например:

interface ICar
{
    void Configure();
}

class TT77Car : ICar
{
    public void Configure()
    {
    ConfigClasses.Add(
                    item.Key,
                    new CarsTT(item.Value, item.Value, "", "start"));

    }
}

...

class D8797 : ICar
{
    public void Configure()
    {
    ConfigClasses.Add(
                    item.Key,
                    new Carsd8080(null, new List<string[]>()));
    }
}


//And this is how to use it
ICar car = //resolve to the car item: new Car(), via IoC or whatever
car.Configure();
0 голосов
/ 15 июля 2011

Я не думаю, что вы можете избежать оператора switch. однако вы можете сделать это:

foreach (var item in Cars)
{
    switch (item.Key)
    {
        case "tt77":
        case "tt90":
            {
                ConfigClasses.Add(
                    item.Key, 
                    new CarsTT(item.Value, item.Value, "", "start"));
            } break;
        case "d8080":
            {
                ConfigClasses.Add(
                    item.Key, 
                    new Carsd8080(null, new List<string[]>()));
            } break;
        case "d8797":
            {
                ConfigClasses.Add(
                    item.Key, 
                    new Carsd8080(item.Value));
            } break;
        default: break;
    }

}
...