我把一串命令存成字符串
如 string str ="messagebox.show("test","test");"; 我在语句中 怎么把 str的内容变成 命令 来执行输出 test?初步了解是用 Microsoft.CSharp 中类的方法,看了半天没了解用法;有没人提供下代码或事例啊..
拜托各位讲解一下吧
如 string str ="messagebox.show("test","test");"; 我在语句中 怎么把 str的内容变成 命令 来执行输出 test?初步了解是用 Microsoft.CSharp 中类的方法,看了半天没了解用法;有没人提供下代码或事例啊..
拜托各位讲解一下吧
解决方案 »
- ASP.NET母版,为什么会找不到Jquery的定义的?Jquery自动完成提示不出来
- C# WinForm 中,如何把數據Bind到Farpoint spread上去?
- toolstrip怎么加入ICO图标呢?
- DataTable导入数据库的问题
- 十六进制转换成二进制的方法
- 关于web程序中,类何时实例化比较好
- 发现Camtasia Studio、Adobe Acrobat 7等软件的有些窗口上下高度超过屏幕高度,使得最下面一排的按钮看不到无法操作,只能将任务条改为隐藏才能勉强的操作到,怎么办?这总不是软件开发者故意这样做,造成我们操作不方便吧?
- 调用C++类库 muParser的问题,编译为64位出错
- 关于C#窗体程序中的整个应用程序的变量
- 请教关于面向对象的程序设计问题,谢谢
- 给对象的多个类似属性赋值
- 关于一个css应用于menu控件的问题
可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
需要使用的命名空间: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));
}
}
}
http://www.cnblogs.com/lovecherry/archive/2005/03/25/125520.html
我学习学习