如何动态替换类
本文关键字:替换 动态 何动态 | 更新日期: 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都需要有相同的构造函数。您可以将所有可能的参数打包到一个对象中,并将其作为构造函数参数传递,然后构造函数从对象中提取所需的内容。
指出:
- 这并不是严格正确的,你可以这样做,以便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();