如何动态替换类

时间:2011-07-15 11:59:34

标签: c# c#-2.0 dynamic

我有动态列表车。 用于编辑数据的每种类型的某些配置设置都需要不同的形式。

示例:

输入tt77,tt90 - 使用了CarsTT类 d8080 - 二手Carsd8080 d8797 - 也使用此类但具有不同的拥塞。

它可以像自动化,或者我总是必须使用SWITCH

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 :(得分:0)

我认为你不能避免使用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;
    }

}

答案 1 :(得分:0)

你总是可以创建一个:

SortedDictionary <string, ConstructorInfo> factory;

然后执行:

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

但您有构造函数,它们采用不同的参数列表。这是个问题。您需要为每种类型 1 使用相同的构造函数。您可以将所有可能的参数打包到一个对象中并将其作为构造函数参数传递,然后构造函数从对象中提取它所需的内容。

注意:

  1. 这不是严格意义上的,您可以使Invoke调用具有构造函数所需的数据 - ConstructorInfo类型包含所有参数类型的列表。

答案 2 :(得分:0)

如果类型的数量是硬编码的并且不会更改,则可以在此处使用多态。例如:

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();