目前,我有这样的代码:
static void Main()
{
int whichClass = 0;
if (whichClass == 0)
{
//repeat code
TestAbstract clTest = new ClassA();
clTest.MainFunc();
}
else if (whichClass == 1)
{
//repeat code
TestAbstract clTest = new ClassB();
clTest.MainFunc();
}
else if (whichClass == 10)
{
//repeat code
TestAbstract clTest = new ClassX();
clTest.MainFunc();
}
}
如您所见,我必须为 3 个不同类的初始和调用函数编写 3 次代码。
我想要的是我们只用动态类调用 1 次。怎么可能?
嗯,你可以有一个 Dictionary<int, Type>
, 或 Dictionary<int, Func<TestAbstract>
:
var typeMapping = new Dictionary<int, Type>
{
{ 0, typeof(ClassA) },
{ 1, typeof(ClassB) },
{ 10, typeof(ClassX) }
};
...
Type type;
if (typeMapping.TryGetValue(whichClass, out type))
{
TestAbstract test = (TestAbstract) Activator.CreateInstance(type);
test.MainFunc();
}
使用 Func<TestAbstract>
将为您创建 TestAbstract
的方式提供更大的灵 active 实例,并提供更多的编译时类型安全性,但更冗长:
var factoryMapping = new Dictionary<int, Func<TestAbstract>>
{
{ 0, () => new ClassA() },
{ 1, () => new ClassB() },
{ 10, () => new ClassX() }
};
...
Func<TestAbstract> factory;
if (factoryMapping.TryGetValue(whichClass, out factory))
{
TestAbstract test = factory();
test.MainFunc();
}
顺便说一下,不清楚整数值的来源 - 您可能需要一个枚举。哎呀,枚举名称甚至可以是类型的名称:
TestClass whichClass = TestClass.ClassA;
...
Type type = Type.GetType("SomeNamespace." + whichClass);
TestAbstract test = (TestAbstract) Activator.CreateInstance(type);