社区
C#
帖子详情
重发 字符串转化为命令
jeason_jun
2008-07-08 04:38:09
我把一串命令存成字符串
如 string str ="messagebox.show("test","test");";
我在语句中 怎么把 str的内容变成 命令 来执行输出 test?
初步了解是用 Microsoft.CSharp 中类的方法,看了半天没了解用法;
有没人提供下代码或事例啊..
拜托各位讲解一下吧
...全文
139
4
打赏
收藏
重发 字符串转化为命令
我把一串命令存成字符串 如 string str ="messagebox.show("test","test");"; 我在语句中 怎么把 str的内容变成 命令 来执行输出 test? 初步了解是用 Microsoft.CSharp 中类的方法,看了半天没了解用法; 有没人提供下代码或事例啊.. 拜托各位讲解一下吧
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jeason_jun
2008-07-08
打赏
举报
回复
十分感谢 Kamui,
我学习学习
tfrtfr
2008-07-08
打赏
举报
回复
借花献佛
http://www.cnblogs.com/lovecherry/archive/2005/03/25/125520.html
nattystyle
2008-07-08
打赏
举报
回复
Mark
ericzhangbo1982111
2008-07-08
打赏
举报
回复
在软件开发尤其是框架和底层开发时,为了更灵活的控制代码,常常需要进行一些动态的操作。比如根据用户的输入等动态的调用类中的方法或者根据数据库表结构、用户要求动态的生成一些类,然后再动态的调用类中的方法。当然使用这些方式时会对性能有一点影响,具体使用过程中可以根据实际情况来定,不过一般的B/S开发中主要的瓶颈还是在数据库操作和网速方面,这点影响应该可以忽略的
一、反射的使用
可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
需要使用的命名空间:System.Reflection
反射的作用很多,下面的例子主要是看一下怎么动态的调用类中的方法。
例子类
class ReflTest1
{
private string _prop1;
public string Prop1
{
get { return _prop1; }
set { _prop1 = value; }
}
public void Write1(string strText)
{
Console.WriteLine(\"111111111:\" + strText);
}
public void Write2(string strText)
{
Console.WriteLine(\"222222222:\" + strText);
}
public void MyWrite(string strText)
{
Console.WriteLine(\"3333333333:\" + strText);
}
}
这个例子中提供了三个方法和一个属性,下面的代码来动态的调用它们:
string strText = \"abcd\";
BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public |
BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
Type t = typeof(ReflTest1);
MethodInfo[] mi = t.GetMethods(flags);
Object obj = Activator.CreateInstance(t);
foreach (MethodInfo m in mi)
{
if (m.Name.StartsWith(\"Write\"))
{
m.Invoke(obj, new object[] { strText });
} [Page]
}
MethodInfo mMy = t.GetMethod(\"MyWrite\");
if (mMy != null)
{
mMy.Invoke(obj, new object[] { strText });
}
BindingFlags用来设置要取得哪些类型的方法,然后我们就可以取得这些方法来动态的调用。(当然为了可以循环的调用方法,在方法的命名方面可以自己指定一个规则)
二、动态生成类
我们可以在程序运行过程中调用.NET中提供的编译类,动态的将一段string编译成一个类,然后再通过反射来调用它
需要使用的命名空间:System.CodeDom System.CodeDom.Compiler Microsoft.CSharp System.Reflection
动态创建、编译类的代码如下:
public static Assembly NewAssembly()
{
//创建编译器实例。
provider = new CSharpCodeProvider();
//设置编译参数。
paras = new CompilerParameters();
paras.GenerateExecutable = false;
paras.GenerateInMemory = true;
//创建动态代码。
StringBuilder classSource = new StringBuilder();
classSource.Append(\"public class DynamicClass \\n\");
classSource.Append(\"{\\n\");
//创建属性。
classSource.Append(propertyString(\"aaa\"));
classSource.Append(propertyString(\"bbb\"));
classSource.Append(propertyString(\"ccc\"));
classSource.Append(\"}\");
System.Diagnostics.Debug.WriteLine(classSource.ToString());
//编译代码。
CompilerResults result = provider.CompileAssemblyFromSource(paras, classSource.ToString());
//获取编译后的程序集。
Assembly assembly = result.CompiledAssembly; [Page]
return assembly;
}
private static string propertyString(string propertyName)
{
StringBuilder sbProperty = new StringBuilder();
sbProperty.Append(\" private int _\" + propertyName + \" = 0;\\n\");
sbProperty.Append(\" public int \" + \"\" + propertyName + \"\\n\");
sbProperty.Append(\" {\\n\");
sbProperty.Append(\" get{ return _\" + propertyName + \";} \\n\");
sbProperty.Append(\" set{ _\" + propertyName + \" = value; }\\n\");
sbProperty.Append(\" }\");
return sbProperty.ToString();
}propertyString方法就是用来拼写字符串的
整个代码比较简单,主要步骤就是:1、拼写类的字符串 2、调用CSharpCodeProvider类进行编译得到程序集(assembly)
接下来就可以利用之前反射的方法来动态调用这个类中的属性了:
Assembly assembly = NewAssembly();
object Class1 = assembly.CreateInstance(\"DynamicClass\");
ReflectionSetProperty(Class1, \"aaa\", 10);
ReflectionGetProperty(Class1, \"aaa\");
object Class2 = assembly.CreateInstance(\"DynamicClass\");
ReflectionSetProperty(Class1, \"bbb\", 20);
ReflectionGetProperty(Class1, \"bbb\");
DynamicClass是我动态类的类名,aaa和bbb是其中的属性
ReflectionSetProperty和ReflectionGetProperty代码如下:
给属性赋值
private static void ReflectionSetProperty(object objClass, string propertyName, int value)
{
PropertyInfo[] infos = objClass.GetType().GetProperties();
foreach (PropertyInfo info in infos)
{
if (info.Name == propertyName && info.CanWrite) [Page]
{
info.SetValue(objClass, value, null);
}
}
}
取得属性的值
private static void ReflectionGetProperty(object objClass, string propertyName)
{
PropertyInfo[] infos = objClass.GetType().GetProperties();
foreach (PropertyInfo info in infos)
{
if (info.Name == propertyName && info.CanRead)
{
System.Console.WriteLine(info.GetValue(objClass, null));
}
}
}
Visual C++网络编程经典案例详解 第7章 邮件收发器 SMTP会话过程 smtp
命令
E-mail构造格式 邮件
重发
如果邮件没有发送成功 则客户端应该将该邮件重新进行发送 邮件的
重发
必须在保证邮件内容不发生改变的情况下进行 实际上 邮件进行
重发
只用在原有邮件头的标题字段前加上
字符串
“Resent-” 例如将上述实例中的邮件进行
重发
内容如下 Resent-Data:Tue,04 Feb 2009 21:18:03+0800 Resent-From:lymlrl@163.com Resent-Sender: ly...
JMeter 防
重发
攻击 nonce 和 publickey 的实现
在jmeter request中解决同时包含两个有依赖关系变量的处理方案
协议
重发
&并发-自动化测试工具 V0.2
程序说明:这是自动化测试框架分离出来的
重发
模块,支持C/S B/S架构 1.协议只支持16进制
字符串
,即WPE或封包助手等工具截取的封包格式 2.最大并发 即并发连接数,最大65535 3.并发级 即每秒并发速度,1最慢 5最快 4.协议
重发
控制 -还没加上,程序默认每个连接1秒2次
重发
协议 2015.11.06 第一版 后续更新。。。。
1.使用spring boot的template实现数据的
重发
和定位
package com.wutos.sync.client.component; import java.time.LocalDateTime; import java.util.List; public class ReSendtask implements Runnable { Logger logger = LoggerFactory.getLogger(ReSendtas...
前端接口调试:浏览器编辑
重发
与fetch流式响应实战
前端开发中,接口调试是日常高频场景,而浏览器开发者工具内置的“编辑
重发
”功能,允许开发者从Network面板直接修改请求参数并重新发送,无需改动业务代码,极大缩短了排查接口参数、请求头等问题的周期。与此同时,现代前端项目广泛使用fetch处理流式响应,如AI对话、SSE推送、大文件上传等场景,但ReadableStream对象的特殊性质使得直接console.log只能看到锁定的流对象,无法获取实际数据。针对这一痛点,本文通过实际案例,详细讲解如何利用编辑
重发
快速定位接口参数问题,通过reader.read
C#
111,128
社区成员
642,536
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章