C# 如何在不使用IF条件的情况下执行此操作
我有一个定义一个方法的接口。此接口有多个类,它们以不同的方式实现该接口 例如: 我的工厂类将有一堆这样的IF语句C# 如何在不使用IF条件的情况下执行此操作,c#,oop,object-oriented-analysis,C#,Oop,Object Oriented Analysis,我有一个定义一个方法的接口。此接口有多个类,它们以不同的方式实现该接口 例如: 我的工厂类将有一堆这样的IF语句 if (some condition) { IJob job = new SomeJob (); else { IJob job = new AnotherJob (); } 是否有一种方法可以避免每次出现新情况时修改factory类。这不能仅仅通过添加一个实现IJob的新类来实现吗 编辑: [我正试图弄清楚这些人在做什么] 感谢您的时间…您必须以某种方式将条件和决
if (some condition)
{
IJob job = new SomeJob ();
else
{
IJob job = new AnotherJob ();
}
是否有一种方法可以避免每次出现新情况时修改factory类。这不能仅仅通过添加一个实现IJob的新类来实现吗
编辑:
[我正试图弄清楚这些人在做什么]
感谢您的时间…您必须以某种方式将条件和决策联系起来
Dictionary<int, Action<IJob>> _methods = new ...
然后使用它:
public IJob FactoryMethod(int condition)
{
if(_methods.ContainsKey(condition))
{
return _methods[int]();
}
return DefaultJob; //or null
}
您需要在应用程序启动时填写字典。从配置文件,或与其他一些代码。
所以当你有新的情况时,你不需要改变工厂。
您喜欢这种变体吗?我不喜欢您,但您可以始终使用泛型:
public IJob GetJob<T>() where : IJob ,new()
{
IJob job = new T();
return job;
}
public IJob GetJob()其中:IJob,new()
{
IJob作业=新的T();
返回工作;
}
在某些地方,必须做出创建内容的决定,而且可能总是涉及某种类型的条件语句
但是,如果可以按照合理的命名约定进行安排和/或添加反射支持(如属性),则可以通过使用反射来减少修改factory类的需要
有关如何在.Net中执行此操作的一些想法,请参阅
您还可以根据字符串到类名的映射,甚至是在应用程序启动时加载的方法的另一个好答案中,做出决定,并在运行时通过反射创建类。有些东西必须提供地图,但您可以将大部分决策转移到配置上。这取决于您所在领域的动态。如果您需要经常评估条件,您可以为
IJob
的每个实现使用某种工厂,例如SomeJobFactory
,另一个jobfactory
每个方法都有方法meetcondition
,如果满足条件,该方法将计算为true,然后返回新实例
public class SomeJobFactory : Factory<IJob>
{
public bool MeetsCondition() { ... }
public IJob CreateInstance() { return new SomeJob(); }
}
您还可以使用IoC获取所有工作工厂:
allJobFactories = IoC.ResolveAll<Factory<IJob>>();
allJobFactories=IoC.ResolveAll();
在本例中,添加新作业工厂时,不必修改一行代码
如果您的代码比较静态,您可以使用DI和IoC,在启动时在其中创建对象。如果您不想
If
条件编译器如何理解您要执行的开关代码块。?程序运行时条件会改变吗?对象应该分配到某个地方。@Antonizikov:是的,条件将取决于用户输入。@KarelFrajtak:但是需要有一些条件,根据这些条件,我将正确的对象发送给期望它的类。对吗?。。您有任何代码示例吗?这没有帮助,因为调用者需要知道实现类型(它的调用方式是这样的var job=Factory.GetJob()
),那么工厂给您带来了什么好处呢?我建议使用与int不同的类型(可能是enum?),以使意图更加可读和明显(1在这里表示什么?var job=JobFactory.GetJob(1)
)var job=JobFactory.GetJob(Requirement.CleanUp)
更好地传达了意图,int是一个例子。字典的方法名也是一个例子。FactoryMethod是一个坏名字:)总之,好的建议。谢谢你的链接。我去看看。加载所有类不会影响实时应用程序的性能吗?您可能会“及时”加载类。也就是说,当调用工厂方法时,工厂仍然使用反射来完成。
public class SomeJobFactory : Factory<IJob>
{
public bool MeetsCondition() { ... }
public IJob CreateInstance() { return new SomeJob(); }
}
foreach(var jobFactory in allJobFactories)
{
if(jobFactory.MeetsCondition())
{
return jobFactory.CreateInstance();
}
}
allJobFactories = IoC.ResolveAll<Factory<IJob>>();