如何动态替换类

本文关键字:替换 动态 何动态 | 更新日期: 2023-09-27 18:02:06

我有动态List Cars。每种类型的某些配置设置编辑数据需要不同的表单。

的例子:

类型tt77, tt90 -使用类CarsTTd8080 -使用类Carsd8080D8797 -也使用这个类,但阻塞不同。

它可以是自动的,或者我必须总是使用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;
    }
}

如何动态替换类

您可以创建一个:

SortedDictionary <string, ConstructorInfo> factory;

,然后做:

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

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

指出:

  1. 这并不是严格正确的,你可以这样做,以便Invoke调用具有构造函数所需的数据- ConstructorInfo类型包含所有参数类型的列表。

我不认为你可以避免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;
    }
}

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

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