勇哥之前学习反射时的测试代码,希望对各位有点参考意义。
程序工程结构如下:
参考代码:
lib1.class1.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace lib1 { public class Class1 { public enum people { blue8,hackpig,hao123,homemy } private string _name; public string Name { get { return _name; } set { _name = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } public Class1() { _age = 18; Name = "刘小勇"; } public int test1(int a, int b) { return a + b; } public string test2(string s1, string s2) { return s1 + "," + s2; } } }
reflectTest.class1.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace reflectTest { class Class1 { public static string StaticPer = "StaticPer..."; public readonly string ReadOnlyPer = "ReadOnlyPer.."; public const string ConstPer = "ConstPer.."; public string GetPer { get { return "GetPer..."; } } private string _SetPer; public string SetPer { set { _SetPer = value; } } public string GetSetPer { get; set; } public Class1() { } public string test1(int param) { return "刘小勇"+param; } private int test2() { return 888; } } }
reflectTest.class2.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using Microsoft.CSharp; using System.CodeDom.Compiler; namespace reflectTest { class Class2 { public static Assembly NewAssembly() { //创建编译器实例。 var provider = new CSharpCodeProvider(); //设置编译参数。 var cp = new CompilerParameters(); cp.GenerateExecutable = false; cp.GenerateInMemory = true; // Generate an executable instead of // a class library. //cp.GenerateExecutable = true; // Set the assembly file name to generate. cp.OutputAssembly = "c:\\1.dll"; // Generate debug information. cp.IncludeDebugInformation = true; // Save the assembly as a physical file. cp.GenerateInMemory = false; // Set the level at which the compiler // should start displaying warnings. cp.WarningLevel = 3; // Set whether to treat all warnings as errors. cp.TreatWarningsAsErrors = false; // Set compiler argument to optimize output. cp.CompilerOptions = "/optimize"; cp.ReferencedAssemblies.Add("System.dll"); //cp.ReferencedAssemblies.Add("System.Core.dll"); cp.ReferencedAssemblies.Add("System.Data.dll"); //cp.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll"); cp.ReferencedAssemblies.Add("System.Deployment.dll"); cp.ReferencedAssemblies.Add("System.Design.dll"); cp.ReferencedAssemblies.Add("System.Drawing.dll"); cp.ReferencedAssemblies.Add("System.Windows.Forms.dll"); //创建动态代码。 StringBuilder classSource = new StringBuilder(); classSource.Append("using System;using System.Windows.Forms;\npublic class DynamicClass: UserControl \n"); classSource.Append("{\n"); classSource.Append("public DynamicClass()\n{\nInitializeComponent();\nConsole.WriteLine(\"hello\");}\n"); classSource.Append("private System.ComponentModel.IContainer components = null;\nprotected override void Dispose(bool disposing)\n{\n"); classSource.Append("if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);\n}\n"); classSource.Append("private void InitializeComponent(){\nthis.SuspendLayout();this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);"); classSource.Append("this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.Name = \"DynamicClass\";this.Size = new System.Drawing.Size(112, 74);this.ResumeLayout(false);\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(cp, classSource.ToString()); if (result.Errors.Count > 0) { for (int i = 0; i < result.Errors.Count; i++) Console.WriteLine(result.Errors[i]); Console.WriteLine("error"); return null; } //获取编译后的程序集。 Assembly assembly = result.CompiledAssembly; 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(); } } }
reflectTest.class3.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; using System.CodeDom; using System.CodeDom.Compiler; using Microsoft.CSharp; namespace reflectTest { class Class3 { public static object InvokeWebService(string url, string methodname, object[] args) { return InvokeWebService(url, null, methodname, args); } public static object InvokeWebService(string url, string classname, string methodname, object[] args) { string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling"; if ((classname == null) || (classname == "")) { classname = GetWsClassName(url); } try { //获取WSDL WebClient wc = new WebClient(); Stream stream = wc.OpenRead(url + "?WSDL"); //ServiceDescription sd = ServiceDescription.Read(stream); //ServiceDescriptionImporter sdi = new ServiceDescriptionImporter(); //sdi.AddServiceDescription(sd, "", ""); CodeNamespace cn = new CodeNamespace(@namespace); //生成客户端代理类代码 CodeCompileUnit ccu = new CodeCompileUnit(); ccu.Namespaces.Add(cn); //sdi.Import(cn, ccu); CSharpCodeProvider csc = new CSharpCodeProvider(); ICodeCompiler icc = csc.CreateCompiler(); //设定编译参数 CompilerParameters cplist = new CompilerParameters(); cplist.GenerateExecutable = false; cplist.GenerateInMemory = true; cplist.ReferencedAssemblies.Add("System.dll"); cplist.ReferencedAssemblies.Add("System.XML.dll"); cplist.ReferencedAssemblies.Add("System.Web.Services.dll"); cplist.ReferencedAssemblies.Add("System.Data.dll"); //编译代理类 CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu); if (true == cr.Errors.HasErrors) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } //生成代理实例,并调用方法 System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(@namespace + "." + classname, true, true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(methodname); return mi.Invoke(obj, args); } catch (Exception ex) { throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace)); } } private static string GetWsClassName(string wsUrl) { string[] parts = wsUrl.Split('/'); string[] pps = parts[parts.Length - 1].Split('.'); return pps[0]; } } }
reflectTest.class4.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace reflectTest { /// <summary> /// 数据库字段的用途。 /// </summary> public enum EnumDBFieldUsage { /// <summary> /// 未定义。 /// </summary> None = 0x00, /// <summary> /// 用于主键。 /// </summary> PrimaryKey = 0x01, /// <summary> /// 用于唯一键。 /// </summary> UniqueKey = 0x02, /// <summary> /// 由系统控制该字段的值。 /// </summary> BySystem = 0x04 } [AttributeUsage(AttributeTargets.Property, Inherited = true)] public class DBFieldAttribute : Attribute { EnumDBFieldUsage m_usage; string m_strFieldName; string m_strDescription; object m_defaultValue; public DBFieldAttribute(string strFieldName, object defaultValue, EnumDBFieldUsage usage, string strDescription) { m_strFieldName = strFieldName; m_defaultValue = defaultValue; m_usage = usage; m_strDescription = strDescription; } public DBFieldAttribute(string fieldName) : this(fieldName, null, EnumDBFieldUsage.None, null) { } public DBFieldAttribute(string fieldName, EnumDBFieldUsage usage) : this(fieldName, null, usage, null) { } // 获取该成员映射的数据库字段名称。 public string FieldName { get { return m_strFieldName; } set { m_strFieldName = value; } } // 获取该字段的默认值 public object DefaultValue { get { return m_defaultValue; } set { m_defaultValue = value; } } } }
reflectTest.class5.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace reflectTest { class DalObj { string m_strTableName; int m_nID; string m_strName; string m_password; public DalObj(string strTableName) { m_strTableName = strTableName; } [DBField("id", EnumDBFieldUsage.PrimaryKey)] public int ID { get { return m_nID; } set { m_nID = value; } } [DBField("name", DefaultValue = "游客")] public string Name { get { return m_strName; } set { m_strName = value; } } [DBField("pwd")] public string PassWord { get { return m_password; } set { m_password = value; } } } }
reflectTest.class6.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.Windows.Forms; namespace reflectClass6 { class TestClass { public delegate string TestDelegate(); public void TestMethod(TestDelegate foo) { //Console.WriteLine(foo()); MessageBox.Show(foo()); } } class Program1 { public static string GetText() { return "Hello World!"; } public static void MainFun() { //string assemblyname = Assembly.Load("reflectTest").FullName ; //reflectTest //assemblyname = Assembly.GetAssembly(typeof(Program1)).FullName; //reflectTest object obj = Activator.CreateInstance(Assembly.GetAssembly(typeof(Program1)).FullName, "reflectClass6.TestClass").Unwrap(); Type del = obj.GetType().GetNestedType("TestDelegate"); var method = obj.GetType().GetMethod("TestMethod"); Delegate d = Delegate.CreateDelegate(del, typeof(Program1).GetMethod("GetText")); method.Invoke(obj, new object[] { d }); } } }
reflectTest.Form1.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Reflection; using System.Diagnostics; namespace reflectTest { public partial class Form1 : Form { enum enum1 { a1, a2, a3 } public Form1() { InitializeComponent(); } private void btnTest1_Click(object sender, EventArgs e) { //按钮“遍历类的成员” var obj = new Class1(); var type = obj.GetType(); var p = type.GetProperties(BindingFlags.Instance | BindingFlags.Public ); StringBuilder sb1 = new StringBuilder(); MemberInfo[] members = type.GetMembers(); foreach (MemberInfo m in members) { switch (m.MemberType) { case MemberTypes.Constructor: sb1.Append(string.Format("构造函数:{0}\n",m.Name)); break; case MemberTypes.Field: sb1.Append(string.Format("字段:{0}\n", m.Name)); break; case MemberTypes.Method: sb1.Append(string.Format("方法:{0}\n", m.Name)); break; case MemberTypes.Property: sb1.Append(string.Format("属性:{0}\n", m.Name)); break; } } foreach (var item in p) { sb1.Append(string.Format("Name: {0}\n", item.Name)); } foreach (FieldInfo field in type.GetFields()) { sb1.Append(string.Format("Field: {0}, Value:{1}\n", field.Name, field.GetValue(obj))); } MethodInfo[] methods = type.GetMethods(); foreach (MethodInfo m in methods) { sb1.Append(string.Format("方法名:{0}\n",m.Name)); } this.rtbMsg.AppendText(sb1.ToString()); //由属性名取其值 var value = type.GetFields().FirstOrDefault(f => f.Name == "StaticPer").GetValue(obj); this.rtbMsg.AppendText(value.ToString()+"\n"); //调用成员方法 foreach (MethodInfo m in methods) { if (m.Name.Equals("test1")) { object[] ob=new object[]{888}; this.rtbMsg.AppendText(string.Format("test()={0}", m.Invoke( obj, ob) )); break; } } } private void btnTest2_Click(object sender, EventArgs e) { //按钮“动态创建类” Assembly a1 = Class2.NewAssembly(); } private void btnTest3_Click(object sender, EventArgs e) { //按钮“Type类” string[] s1 = new string[] { "a","b","c"}; double d1 = 10; Type t1 = d1.GetType(); Type t2 = Type.GetType("System.Double"); Type t3=typeof(Class1); Assembly assem = t3.Assembly; StringBuilder sb1=new StringBuilder(); sb1.Append(string.Format(@" 数据类型名:{0} 数据类型完全限定名(包括名称空间):{1} 在其中定义数据类型的名称空间名:{2} 该Type的直接基本类型: {3} 该Type在.net运行库中映射到的类型: {4} t1.IsAbstract={5} t1.IsClass={6} t1.IsEnum={7} t1.IsInterface={8} t1.IsValueType={9} t1.IsPrimitive={10} Class1.IsClass={11} enum1.IsEnum={12} sender.IsMarshalByRef={13} Class1.Assembly={14} ", t1.Name,t1.FullName,t1.Namespace,t1.BaseType,t1.UnderlyingSystemType, t1.IsAbstract,t1.IsClass,t1.IsEnum,t1.IsInterface,t1.IsValueType,t1.IsPrimitive, typeof(Class1).IsClass, typeof(enum1).IsEnum, sender.GetType().IsMarshalByRef, assem.FullName)); this.rtbMsg.AppendText(sb1.ToString()); Type t5 = typeof(double); ConstructorInfo[] ci = t5.GetConstructors(); EventInfo[] ei = t5.GetEvents(); FieldInfo[] fi = t5.GetFields(); Type[] im = t5.GetInterfaces(); MemberInfo[] mi = t5.GetMembers(); MethodInfo[] mei = t5.GetMethods(); PropertyInfo[] pi = t5.GetProperties(); Debug.Assert(false); } private void btnTest4_Click(object sender, EventArgs e) { //按钮“Assembly类” StringBuilder sb1 = new StringBuilder(); Assembly assem = Assembly.LoadFile(Environment.CurrentDirectory + "\\lib1.dll"); Type[] t1 = assem.GetTypes(); foreach (Type m in t1) { MemberInfo[] mi = m.GetMembers(); foreach (MemberInfo m1 in mi) { sb1.Append(string.Format("Type m: {0},{1},{2} \nMemberInfo: Name={3},Module={4},MemberType={5}\n", m.Name, m.Module, m.MemberType, m1.Name, m1.Module, m1.MemberType)); } } this.rtbMsg.AppendText(sb1.ToString()); } private void btnTest5_Click(object sender, EventArgs e) { //按钮“自定义属性” DalObj dalObj = new DalObj("users"); StringBuilder sb = new StringBuilder(); foreach (PropertyInfo proInfo in dalObj.GetType().GetProperties()) { object[] attrs = proInfo.GetCustomAttributes(typeof(DBFieldAttribute), true); if (attrs.Length == 1) { DBFieldAttribute attr = (DBFieldAttribute)attrs[0]; sb.Append(attr.FieldName + ":" + (attr.DefaultValue == null ? "null" : attr.DefaultValue.ToString()) + "\r\n"); } } MessageBox.Show(sb.ToString()); } private void btnTest6_Click(object sender, EventArgs e) { //按钮“调用delegate” reflectClass6.Program1.MainFun(); } private void button1_Click(object sender, EventArgs e) { //铵钮“GetValue()” string test = "abcdefghijklmnopqrstuvwxyz"; // Get a PropertyInfo object representing the Chars property. PropertyInfo pinfo = typeof(string).GetProperty("Chars"); // Show the first, seventh, and last letters ShowIndividualCharacters(pinfo, test, 0, 6, test.Length - 1); // Show the complete string. Console.Write("The entire string: \n"); for (int x = 0; x < test.Length; x++) { rtbMsg.AppendText(pinfo.GetValue(test, new Object[] { x }).ToString()+"\n"); } Console.WriteLine(); } void ShowIndividualCharacters(PropertyInfo pinfo, object value, params int[] indexes) { foreach (var index in indexes) { rtbMsg.AppendText(string.Format("Character in position {0,2}: '{1}'\n", index, pinfo.GetValue(value, new object[] { index }))); } } private void button2_Click(object sender, EventArgs e) { //按钮“SetValue()” MyClass tmp_Class = new MyClass(); tmp_Class.Property1 = 2; Type type = tmp_Class.GetType(); //获取类型 System.Reflection.PropertyInfo propertyInfo = type.GetProperty("Property1"); //获取指定名称的属性 int value_Old = (int)propertyInfo.GetValue(tmp_Class, null); //获取属性值 rtbMsg.AppendText(value_Old.ToString()+"\n"); propertyInfo.SetValue(tmp_Class, 5, null); //给对应属性赋值 int value_New = (int)propertyInfo.GetValue(tmp_Class, null); rtbMsg.AppendText(value_New.ToString()+"\n"); } private void button3_Click(object sender, EventArgs e) { //按钮“由变量名字符串,为这个变量赋值” test1(); } private void test1() { var words = new string[] { "Name", "123" }; Type myTypeA = typeof(common_setting); object commonSetting = new common_setting(); string name1 = ((common_setting)commonSetting).Name; var myfieldInfo = myTypeA.GetField(words[0]); myfieldInfo.SetValue(commonSetting, words[1]); string name2 = ((common_setting)commonSetting).Name; rtbMsg.AppendText(name2); } } public class MyClass { public int Property1 { get; set; } } public struct common_setting { public string Name; } }
程序在勇哥的电脑上运行结果如下:
//按钮“Type类” ================ 数据类型名:Double 数据类型完全限定名(包括名称空间):System.Double 在其中定义数据类型的名称空间名:System 该Type的直接基本类型: System.ValueType 该Type在.net运行库中映射到的类型: System.Double t1.IsAbstract=False t1.IsClass=False t1.IsEnum=False t1.IsInterface=False t1.IsValueType=True t1.IsPrimitive=True Class1.IsClass=True enum1.IsEnum=True sender.IsMarshalByRef=True Class1.Assembly=reflectTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null //按钮“Assembly类” ================ Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=get_Name,Module=lib1.dll,MemberType=Method Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=set_Name,Module=lib1.dll,MemberType=Method Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=get_Age,Module=lib1.dll,MemberType=Method Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=set_Age,Module=lib1.dll,MemberType=Method Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=test1,Module=lib1.dll,MemberType=Method Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=test2,Module=lib1.dll,MemberType=Method Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=ToString,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=Equals,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=GetHashCode,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=GetType,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=.ctor,Module=lib1.dll,MemberType=Constructor Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=Name,Module=lib1.dll,MemberType=Property Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=Age,Module=lib1.dll,MemberType=Property Type m: Class1,lib1.dll,TypeInfo MemberInfo: Name=people,Module=lib1.dll,MemberType=NestedType Type m: people,lib1.dll,NestedType MemberInfo: Name=Equals,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: people,lib1.dll,NestedType MemberInfo: Name=GetHashCode,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: people,lib1.dll,NestedType MemberInfo: Name=ToString,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: people,lib1.dll,NestedType MemberInfo: Name=ToString,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: people,lib1.dll,NestedType MemberInfo: Name=CompareTo,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: people,lib1.dll,NestedType MemberInfo: Name=ToString,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: people,lib1.dll,NestedType MemberInfo: Name=ToString,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: people,lib1.dll,NestedType MemberInfo: Name=HasFlag,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: people,lib1.dll,NestedType MemberInfo: Name=GetTypeCode,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: people,lib1.dll,NestedType MemberInfo: Name=GetType,Module=CommonLanguageRuntimeLibrary,MemberType=Method Type m: people,lib1.dll,NestedType MemberInfo: Name=value__,Module=lib1.dll,MemberType=Field Type m: people,lib1.dll,NestedType MemberInfo: Name=blue8,Module=lib1.dll,MemberType=Field Type m: people,lib1.dll,NestedType MemberInfo: Name=hackpig,Module=lib1.dll,MemberType=Field Type m: people,lib1.dll,NestedType MemberInfo: Name=hao123,Module=lib1.dll,MemberType=Field Type m: people,lib1.dll,NestedType MemberInfo: Name=homemy,Module=lib1.dll,MemberType=Field ////铵钮“GetValue()” ================ Character in position 0: 'a' Character in position 6: 'g' Character in position 25: 'z' a b c d e f g h i j k l m n o p q r s t u v w x y z //按钮“SetValue()” ================ 2 5 //按钮“由变量名字符串,为这个变量赋值” ================ 123 //按钮“遍历类的成员” ================ 方法:get_GetPer 方法:set_SetPer 方法:get_GetSetPer 方法:set_GetSetPer 方法:test1 方法:ToString 方法:Equals 方法:GetHashCode 方法:GetType 构造函数:.ctor 属性:GetPer 属性:SetPer 属性:GetSetPer 字段:ReadOnlyPer 字段:StaticPer 字段:ConstPer Name: GetPer Name: SetPer Name: GetSetPer Field: ReadOnlyPer, Value:ReadOnlyPer.. Field: StaticPer, Value:StaticPer... Field: ConstPer, Value:ConstPer.. 方法名:get_GetPer 方法名:set_SetPer 方法名:get_GetSetPer 方法名:set_GetSetPer 方法名:test1 方法名:ToString 方法名:Equals 方法名:GetHashCode 方法名:GetType StaticPer... test()=刘小勇888
//按钮“自定义属性”
//按钮“调用delegate”
演示代码下载:
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

本帖最后由 勇哥,很想停止 于 2023-02-27 09:47:17 编辑 
