c# - 如何在这种情况下使用更少的代码

标签 c#

<分区>

目前,我有这样的代码:

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

关于c# - 如何在这种情况下使用更少的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14395471/

相关文章:

c# - 在 Asp.net Web API 中处理 CORS 预检

c# - 世界CF。服务上的异步和同步方法之间的性能差异是什么?

c# - 使用 MVC2 的 EditorFor helper 时如何控制 html 元素的 id 和名称

c# - "HTTP Error 502.5 - Process Failure"使用 ASP.NET Core 2.1 WebAPI 访问 Azure PaaS 中的 Azure Key Vault

c# - 不正确的 float 减法结果

java - java中是否有相当于Path.IsPathRooted()的函数?

c# - 使用 typeof 时与依赖注入(inject)有什么区别?

c# - 获取字典中最大的键

c# - Caliburn NotifyOfPropertyChanged : System. InvalidCastException

c# - 显示与所示骰子图像相关的数值