[C#] 如何将字典的value赋值为函数
0. 应用场景
将用户上传到的图片, 根据保密程度有三种处理方式,1.放置于服务器上,可直接访问, 2.放置于服务器上,但需要从数据库查询路径,3.将文件写入MongoDB中
1. Nodejs操作思路
因为本人毕业先做的Nodejs后端开发, 一些思路固定了,习惯了之前的编程方法,再转移到现用语言中。
function saveNormalFile() { console.log("放置于服务器上,可直接访问") } function savePathToDB() { console.log("放置于服务器上,但需要从数据库查询路径") } function saveFileToDB() { console.log("将文件写入MongoDB") } const methodMap = { 0:saveNormalFile, 1:savePathToDB, 2:saveFileToDB }; const file = { level:0, data:"二进制流", name:"2333.png", user:"aha" }; // 根据文件类型,选择存储函数 methodMap[file.level]();
程序输出: 放置于服务器上,可直接访问
switch case的时间复杂最坏情况为n, 平均为 (1+2+3+4+ . . . . . +n) / n = ( (1+n) * n/2 ) / n = (1+n)/ 2, 并且代码的分支语句太多,不易维护
2. 虽然对C#不熟练,但是肯定可以解决,传递函数的方式就是指针,使用引用类型delegate,最终结果如下
class DictionaryDelegate { public delegate void Method(); // 我的函数没有参数和返回, 可根据自己的需求修改 static Method saveNormalFile = () => { Console.WriteLine("放置于服务器上,可直接访问"); }; static Method savePathToDB = () => { Console.WriteLine("放置于服务器上,但需要从数据库查询路径"); }; static Method saveFileToDB = () => { Console.WriteLine("将文件写入MongoDB"); }; DictionaryMethodDictionary = new Dictionary { {"0", saveNormalFile}, {"1", savePathToDB}, {"2", saveFileToDB}, }; public DictionaryDelegate() { MethodDictionary["0"](); } }
3. 如果不使用简单的lamda函数,也可正常调用委托函数
class DictionaryDelegate { public delegate void Method(); // 我的函数没有参数和返回, 可根据自己的需求修改 public void saveNormalFile() { Console.WriteLine("放置于服务器上,可直接访问"); } public DictionaryDelegate() { DictionaryMethodDictionary = new Dictionary { {"0", new Method(saveNormalFile) } }; MethodDictionary["0"].BeginInvoke(null, null); } }