社区
C#
帖子详情
能不能动态执行方法?
chagel
2005-03-24 03:12:31
比如在config文件中配置类,方法名称.在主程序中根据配置文件指定方法运行? 遐想中...
...全文
232
18
打赏
收藏
能不能动态执行方法?
比如在config文件中配置类,方法名称.在主程序中根据配置文件指定方法运行? 遐想中...
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
chagel
2005-03-25
打赏
举报
回复
我已经实现了.
就是用了大家说的反射实现的.
多谢 xixigongzhu(夕夕宝贝) 给的一些注意点.
稍后我会写篇Blog来记录一下 :)
xixigongzhu
2005-03-25
打赏
举报
回复
还有一点忘记了,要确定这个方法是静态的还是实例的,如果是实例的构造函数又该怎么调用;
当然简单的处理方法就是规定这个方法是静态的(BindingFlags.Static)。
但也可以自己事先定义一个接口,规定这个方法的名字和参数,别人只需要指定一个实现这个接口的类并在配置里给出类的全名就可以了。.net的webform里的Handler就是这样处理的,如上面给出的System.Web.Configuration.HttpCapabilitiesSectionHandler。
xixigongzhu
2005-03-25
打赏
举报
回复
举个例子,比如System.Web.Configuration.HttpCapabilitiesSectionHandler这个类有个Create(object parent,object configContext,XmlNode section)的方法,且这个方法没有重载,所以可以根据方法名取到方法,调用如下:
Type t = Type.GetType(="System.Web.Configuration.HttpCapabilitiesSectionHandler, System.Web, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
object obj = Activator.CreateInstance(t);
object res = t.InvokeMember("Create",
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj,new object[]{null,null,null});
xixigongzhu
2005-03-25
打赏
举报
回复
其实JScript.net的Eval就是用反射实现的,更具体的说JScript.Net几乎都是用反射来实现的。
其实根据类型的全名(注意是全名,包括类的全名和类所在的程序集的全名)和类的方法名(注意方法不能有重载,否则必须知道参数,但也可以规定这类方法不能有参数)是可以调用这个方法的,但还有一点就是这个类所在的程序集文件应该放在什么位置。
也就是说,楼主要实现这个,用反射是个不错的方法,但必须注意几点:
1、类型的名称必须包括类的全名和类所在的程序集的全名,如:"TestNameSpace.TestClass,TestAssembly",这个可以参照machine.config的配置:
<sectionGroup name="system.web">
<section name="browserCaps" type="System.Web.Configuration.HttpCapabilitiesSectionHandler, System.Web, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</sectionGroup>
2、调用的方法名,并且这个方法不能重载或者这个方法的参数必须为空,这样是为了能根据反射找到这个方法,否则条件不够是不可能根据反射找到一个确定的方法的;
3、这个类所在的程序集应该跟应用程序处在同一目录下,否则即使知道程序集的全名也不可能根据反射找到程序集;
qpl007
2005-03-25
打赏
举报
回复
MethodInfo.Invoke()不就可以了
LoveCherry
2005-03-25
打赏
举报
回复
using System;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
using System.Text;
namespace ConsoleApplication22
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
int i = (int)Calc("1+2*3");
Console.WriteLine(i.ToString());
Console.ReadLine();
}
public static object Calc(string expression)
{
string className = "Calc";
string methodName = "Run";
expression=expression.Replace("/","*1.0/");
// 创建编译器实例。
ICodeCompiler complier = (new CSharpCodeProvider().CreateCompiler());
// 设置编译参数。
CompilerParameters paras = new CompilerParameters();
paras.GenerateExecutable = false;
paras.GenerateInMemory = true;
// 创建动态代码。
StringBuilder classSource = new StringBuilder();
classSource.Append("public class "+ className +"\n");
classSource.Append("{\n");
classSource.Append(" public object " + methodName + "()\n");
classSource.Append(" {\n");
classSource.Append(" return "+ expression + ";\n");
classSource.Append(" }\n");
classSource.Append("}");
//System.Diagnostics.Debug.WriteLine(classSource.ToString());
// 编译代码。
CompilerResults result = complier.CompileAssemblyFromSource(paras, classSource.ToString());
// 获取编译后的程序集。
Assembly assembly = result.CompiledAssembly;
// 动态调用方法。
object eval = assembly.CreateInstance(className);
MethodInfo method = eval.GetType().GetMethod(methodName);
object reobj = method.Invoke(eval, null);
GC.Collect();
return reobj;
}
}
}
ccat
2005-03-25
打赏
举报
回复
楼上,Eval是解释型语言特有的东西,如果你使用的是IronPython或JScript.NET这样的CLR解释语言一样可以使用这类功能,这和是不是.net没有关系,取决于你使用的语言类型。
BTW:如果你有足够的Hacker精神,在.net程序中可以设用编译器功能,动态编译和生成程序,这样就算是C#或托管C++,也可以拥有动态语言能力。
slujun
2005-03-25
打赏
举报
回复
用反射,InvokeMember
Clayborne
2005-03-24
打赏
举报
回复
是啊,我也想过这样来用,javascript里不是有个eval方法吗?.net有吗?有可以代替的吗?
aboush
2005-03-24
打赏
举报
回复
反射是可以做到的,但对于插件似乎不一定需要反射.
比如你需要读取数据方法,但你不想知道是从file或是数据库读取,你就可以定义一个interface,然后就不管了,反正实现interface的类的方法你都可以调用.再利用工厂方法和config文件来在运行时决定调用的方法.不知道楼主需要什么.
sfanpu
2005-03-24
打赏
举报
回复
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp05162002.asp
這個例子應該差不多是你想要的。
chagel
2005-03-24
打赏
举报
回复
似乎InvokeMember方法可以办到...
zhongwanli
2005-03-24
打赏
举报
回复
利用反射。
ccat
2005-03-24
打赏
举报
回复
自己作一个框架,或者调用反射功能,确实可以作到。
chagel
2005-03-24
打赏
举报
回复
因为做框架地不知道,接下来谁会定义自己的方法(类似插件),但是我总想要执行它...
chagel
2005-03-24
打赏
举报
回复
我不想用Class.Method()来调用这个方法,我想要动态地获得这个方法名称,然后...来调用这个方法...
是不是很变态,呵呵
xjaifly
2005-03-24
打赏
举报
回复
你在程序中用if语句 判断不可以吗!
干吗要掉config 呢!
cime63
2005-03-24
打赏
举报
回复
看不懂
100家大公司java笔试题汇总
从网上找到的在这里分享一下,可能有点不全或是普遍,但是有答案。
vue
动态
执行
方法
如果你要在脚本里
动态
的调用
方法
,而且可能的入口条件还会依据用户的输入值影响到。如何解决呢。 1、事件发起 <el-button icon="el-icon-video-play" type="text" @click="run"> 运行 </el-button> <el-button icon="el-icon-view" type="text" @click="showJson"> 查看js
Java中的
动态
编译与
执行
技术
在Java编程中,
动态
编译与
执行
技术为开发者提供了强大的工具,使得在运行时生成和
执行
Java代码成为可能。本文将介绍Java中的
动态
编译与
执行
技术,包括相关API的使用和实际应用示例。通过这些技术,开发者可以在运行时生成、编译和
执行
Java代码,从而提高应用程序的灵活性和扩展性。首先,脚本引擎生成Java源文件并
动态
编译,然后通过反射机制加载并
执行
生成的类和
方法
。在
动态
编译Java代码后,接下来就是
动态
执行
生成的字节码。下面的示例展示了如何加载并
执行
动态
编译生成的类。在上面的代码中,我们使用。
【小技巧】-
动态
加载外部jar并
执行
方法
场景 Q:线上环境部署的项目中,需要用到随时可能变更的验证/加解密
方法
,但是又
不能
每次变更都硬编码然后重新线上部署!怎么能在不重新部署线上环境的情况下,变更验证/加解密
方法
呢? A:可以使用下面的
动态
加载外部jar并
执行
方法
实现逻辑 每次变更验证
方法
时,都让客户自己提供一个变更后的jar包,甲乙2方约定jar包中验证
方法
的类/
方法
/入参/出参,再通过页面上传的形式,上传jar包,后台通过反射的形式调用更新的jar包
方法
,达到
动态
更新线上环境验证
方法
的需求。 代码 测试jar包类 package test;
PHP实现
动态
执行
代码的
方法
本文实例讲述了PHP实现
动态
执行
代码的
方法
。分享给大家供大家参考,具体如下: 这里介绍的PHP
动态
执行
,即在页面上直接输入代码,点击
执行
,返回
执行
结果
方法
很简单,主要使用了: $newfunc = create_function(’’, $code); 函数来实现。 代码如下: <?php $code = 'return "no code!";'; if (isset($_POST['co...
C#
111,118
社区成员
642,553
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章