C#从字符串调用数学函数

时间:2019-07-14 07:26:50

标签: c# .net reflection

我想打电话给# -*- mode: python -*- # source: http://qaru.site/questions/8036799/pyinstaller-does-not-work-when-including-pysnmp from PyInstaller.utils.hooks import collect_data_files, collect_submodules x = Tree('C:/Python37/Lib/site-packages/pysnmp/smi/mibs',prefix='pysnmp/smi/mibs',excludes='.py') block_cipher = None a = Analysis(['SNMP.py'], pathex=['path to python file/'], binaries=[], datas=[], hiddenimports=['pysnmp.smi.exval','pysnmp.cache'] + collect_submodules('pysnmp.smi.mibs') + collect_submodules('pysnmp.smi.mibs.instances'), hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, x, name='SNMP', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, runtime_tmpdir=None, console=True , icon='icon.ico') ,但我尝试了以下操作,但它给我错误

Math.Round()

2 个答案:

答案 0 :(得分:4)

您应该使用Math.GetType()而不是typeof(Math)来代表表示类型Type的{​​{1}}实例,因为Math是一种类型,而不是实例类型。

还有更多示例:

Math

尽管这不是必需的,但我将第一个参数作为typeof(int) // ok, int is a type 5.GetType() // ok, 5 is an instance of int typeof(5) // error, 5 is not a type int.GetType() // error, int is not an instance 放在Invoke上,因为您正在调用静态方法:

null

编辑:

刚刚意识到您仍然有一些问题。 Console.WriteLine(method.Invoke(null, 1.78d)); 有很多重载,因此仅使用Round是模棱两可的。您还必须指定参数的类型(GetMethod("Round"))。

double的第二个参数是Invoke,因此您需要使用语法object[]创建一个数组。

new object[] { ... }

答案 1 :(得分:1)

我在这里看到您的代码有3个问题

  1. 数学不是类,因此应调用typeof(Math)而不是Math.GetType()来获得Type
  2. 歧义方法-Math.Round()作为大量重载,因此您指定要与GetMethod(String, Type[])一起使用的重载,例如 Math.Round(Double) ,因此您应该写MethodInfo method = typeof(Math).GetMethod(mathFunc, new[] {typeof(double) }) ;
  3. method.Invoke(this,... )应该用method.Invoke(null, ..)代替,尽管使用此名称是接受的Math.round是静态的,并且第一个对象参数无论如何都将变为空。

因此完整的代码可以是这样的

            string mathFunc = "Round";    
            MethodInfo method = typeof(Math).GetMethod(mathFunc, new[] {typeof(double) }) ;         
            var res = method.Invoke(null, new object[] { 1.78d });
            Console.WriteLine(res);
  

输出:2

dotnetfiddle