我目前正在使用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();
}
}
类可以工作,但我想像生产标准代码那样进行优化。
答案 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);