C#在配置文件中指定不同的算法/逻辑流程

时间:2014-06-04 11:37:16

标签: c#

我想在传递给应用程序的json文件中指定应用程序的功能。这将用于加载不同的库。

例如包含以下内容的词典

"RunType1" : {
    "Init" : "AlgoInit1",
    "Body" : "AlgoBody6",
    "End"  : "AlgoEnd3"
}

这将加载RunType1 dll并选择这些函数。

这可以使用一组if / else语句

if (initText == "AlgoInit1")
    callAlgoInit1();
else (initText == "AlgoInit2")
    callAlgoInit2();

但如果我想在库中添加新算法而不重新编码,那么这会失败。

这些是选择或将函数传递给通用运行结构的更优雅方式吗?

我想做点什么:

runInitAlgo("AlgoInit1"); // take the actual parameter from the config
runBodyAlgo("AlgoBody6");
runEndAlgo("AlgoEnd3");

在C#中实现这一目标的最佳解决方案/模式是什么?因此,我不必将算法函数名称硬编码到应用程序的主体中。

感谢。

3 个答案:

答案 0 :(得分:1)

你可以制作一个词典:

Dictionary<string, Action>actions = new Dictionary<string, Action>();

void Init(){
  actions.Add("Init" ,AlgoInit1);
  actions.Add("Body" ,AlgoBody6);
  actions.Add("End" ,AlgoEnd3);
}

void Do(string action){
   actions[action]();
}

private static void AlgoInit1(){
    throw new NotImplementedException();
}

您的词典可以是班级中的静态词或成员词。

答案 1 :(得分:1)

如果名称对应于DLL,则可以使用这种逻辑动态加载DLL,然后使用相应的类(继承自已知的接口,例如&#34; Algo&#34;):

Assembly assembly = Assembly.LoadFrom("RunType1.dll");
Type dllType = assembly.GetType("RunType1.Algo");
Algo obj = Activator.CreateInstance(dllType) as Algo;
obj.Init();
obj.Body();
obj.End();

参考文献:
http://msdn.microsoft.com/fr-fr/library/f7ykdhsy.aspx
[FR] http://populnet.blogspot.fr/2008/12/charger-une-dll-dynamiquement.html

答案 2 :(得分:0)

你应该解决战略模式(http://en.wikipedia.org/wiki/Strategy_pattern),这或多或少是你想要做的。

对于策略模式的基本C#实现,您可以参考此文档: http://www.codeproject.com/Articles/346873/Understanding-and-Implementing-the-Strategy-Patter