生产标准基于C#中的字符串参数创建类实例

时间:2019-06-21 08:48:09

标签: c# .net-core

我目前正在使用If else语句来确定要创建的类实例,但我认为可能有更好的方法来创建这些类。

我已经尝试过if,else语句和case语句,但是我想要比这些类型更具伸缩性的东西。

此外,在运行for循环然后使用if / else语句创建当前使用的类和项之前,我还不知道这些名称。

public class SomeClass
{
    SomeItem item;
    ISomeInterface sf;

    public SomeClass(SomeItem item)
    {
        this.item = item
    }

    public SomeItem UpdateItem()
    {
        string name = item.name;

        if (name == "a")
        {
            sf = new ClassA(item);
        }
        else if (name == "b")
        {
            sf = new ClassB(item);
        }
        else if (name == "c")
        {
            sf = new ClassC(item);
        }
        else
        {
            sf = new ClassD(item);
        }

        return sf.GetItem();
    }
}

类可以工作,但我想像生产标准代码那样进行优化。

3 个答案:

答案 0 :(得分:0)

使用switch语句:

switch (name)
{
    case "a":
        sf = new ClassA(item);
        break;
    case "b":
        sf = new ClassB(item);
        break;
    case "c":
        sf = new ClassC(item);
        break;
    default:
        sf = new ClassD(item);
        break;
}

答案 1 :(得分:0)

在这里可以考虑多种方法

使用工厂

您可以有一个单独的Factory类,该类可以根据您需要确定的任何参数来创建新实例。在您的示例中,它的名字可以,但是可以更多。

public class ObjectFactory
{
    public BaseType Instance(string name)
    {
        switch(name)
        {
            case "A":
                return A();
            case "B":
                return B()
        }
    }
}

使用依赖注入

您可以使用依赖项注入。注册所有课程并指定密钥。类型的键将是您用来确定实例的名称。然后根据名称动态注入您的类实例。 DI框架将处理创建实例并将其返回的所有逻辑。您可以查询here

对所有类型使用不同的工厂类 您可以根据需要进行动态调整,并在类型本身内部移动匹配类型的逻辑。

    var instances = new Base[]
    {
        new A(),
        new B()
    };

    foreach(var instance in instances)
    {
        if(instance.IsMatch(name))
        {
            return instance;
        }
    }

public abstract class Base
{
    public abstract bool IsMatch(string name);
}

public class A : Base
{
    public override bool IsMatch(string name)
    {
        return name.ToUpper() == "A";
    }
}

public class B : Base
{
    public override bool IsMatch(string name)
    {
        return name.ToUpper() == "B";
    }
}

答案 2 :(得分:-1)

 public T UpdateItem<T>(T item) where T : ISomeInterface, new()
 {
        return new T();
 }

用法

ClassA  a = someclassObject.UpdateItem<ClassA>();

new()表示它具有公共构造函数,并且可以使用new关键字创建对象

编辑: 当您尝试将项目添加到构造函数时,无法使用新的T(arg); 解决方案是ISomeInterface提供方法

 UpdateProperties(SomeItem item);

用法将是T obj = new T(); obj.UpdateProperties(item);