重发 字符串转化为命令

jeason_jun 2008-07-08 04:38:09
我把一串命令存成字符串
如 string str ="messagebox.show("test","test");";

我在语句中 怎么把 str的内容变成 命令 来执行输出 test?

初步了解是用 Microsoft.CSharp 中类的方法,看了半天没了解用法;

有没人提供下代码或事例啊..
拜托各位讲解一下吧
...全文
95 4 打赏 收藏 转发到动态 举报
写回复
用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));
}
}
}
软件介绍:   TCS230测试工具可以使用TTL USB转接线连接电脑,根据命令进行操作,里面有很多的命令。可以进行测试以及调试的功能。  XCOM V2.0更新说明  1.增加了多条发送的数目,多达40条  2.可以任意编辑,导入导出您要发送的条目,文件的格式是excel3.加入了协议传输,支持单次发送,自动连续连续发送,文件发送(如IAP串口升级),配有自动重发机制以及多种校验方式,确保您传输的数据不出错4.加强了16进制发送的功能,自动拆分您发送的字节,不必每隔一个字节就输入空格5.加入了时间戳的功能,以”\r\n”换行回车断帧,在换行回车前加入时间戳串口设置说明  1.软件启动后,会自动搜索可用的串口,可以显示详细的串口信息,由于兼容性原因某些电脑可能不会显示。  2.超高波特率接收,在硬件设别支持的情况下,可自定义波特率,点“自定义”即可输入您想要的波特率,不过需要在串口关闭的情况下,才能修改哦。默认可选波特率为1200bps-1382400bps    3.可以选择为“1、1.5、2”三种停止位.  4.可以选择“5、6、7、8”四种数据长度  5.可选奇,偶校验,或无校验  6.支持串口随时插拔,对于某些硬件设别,由于驱动兼容性的原因可能不支持,实测CH340无问题,建议手动关闭串口显示设置说明  1.16进制显示,勾选后将显示16进制的字节,如果之前接收到了数据,会自动转换,所以当接收的数据量比较大的时候,转换会比较慢2.显示模式设置,默认为黑色背景,绿色字体。勾选“白底黑字”可以将背景设置为白色,字体为黑色3.通过勾选”RTS”,”DTR”可以控制当前串口的RTS和DTR输出4.勾选“时间戳”选项,可以加入时间戳显示,需要注意的是,时间戳是以换行回车断帧,所以,当接收到的数据不含“\r\n”换行回车时,此选项是无效的哦。  5.可以保存接收窗口为任意格式的文件,默认为txt格式的文件6.点击清除接收按钮,可以清除窗口显示的内容,并且清除发送和接收字节计数单条发送说明  1.可以在发送区,发送您发送的任意字符  2.支持16进制发送,勾选16进制发送的时候将对发送区的内容进行16进制和字符互转,输入16进制的时候,支持字节自动拆分,不需要每输入一个字节就输入一个空格。也就是说,输不输入空格随你3.勾选发送新行,将会在发送内容后加入换行回车4.支持定时发送,可以自定义发送周期  5.支持发送任意格式的文件,可以随时终止文件的发送,可以通过下面的进度条查看发送进度6.点击发送按钮,即可发送您想发送的内容,支持快捷键“Ctrl Enter”发送7.点击清除发送按钮,可以清除发送区的内容,并且清除发送和接收字节计数7.在状态栏,可以看到发送和接收的字节数,可以读取当前串口“CTS,DSR,DCD”的状态,可以显示当前的系统时间。在状态栏的最左边,有一个开始按钮,可以调出系统计算器,可以恢复软件的默认设置。也可以从这里退出软件多条发送说明  1.多条发送,适合有多条指令需要发送的场合,比如支持AT指令的设备,蓝牙,GSM,GPS,WIFI等等,配合ALIENTEK的USMART还可以很方便调试代码>  2.可以在任意条目输入您想发送的字符,点击按钮即可发送3.一共有四页,可以通过“首页,上一页,下一页,尾页”按钮来进行页面的切换4.勾选发送新行,将会在发送内容后加入换行回车5.勾选16进制发送,可以支持16进制发送,但是需要注意的是,这里没有进行16进制验证,如果包含非16进制字符,将会导致发送失败6.勾选关联数字键盘,发送条目0-9将会关联到数字键0-9,在键盘上按下响应的按键即可发送。可以方便控制,比如“智能车”,“飞行器”等等其他设备。在小键盘这里可以看做是方向键哦。  7.支持自动循环发送,可自定义发送周期,需要注意的是,没有勾选的发送条目将不会被发送点击“导入导出条目”按钮可以很方便的编辑,导入导出条目,查看条目的备注协议传输说明  此协议是从modbus(rtu)演变而来,可以称之为modbus的变种。协议属于半双工传输的Send-Ack模式,协议自带灵活可配置的自动重发机制,可配置重发次数,重发间隔(即帧周期),多种校验方式,支持校验和,异或,CRC8,CRC16校验,CRC8和CRC16均为查表的方式,效率高,通过这些机制可以有效保证数据的传输质量。支持单次发送,自动发送(自定义周期),文件发送(如,IAP串口升级)三种模式。

110,923

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧