反射初探
实例的class
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleAppModel03 { class TestClass { public TestClass() { } public TestClass(string str) { this.name = str; } public string name { get; set; } public int age { get; set; } public bool sex { get; set; } public void Erite() { if(this.name!=null) System.Console.WriteLine(this.name); else System.Console.WriteLine("value is null"); } public void Erite(string str) { if (this.name != null) System.Console.WriteLine(this.name); else System.Console.WriteLine("value is null"); System.Console.WriteLine("value is "+str); } } }
运行示例
using System; using System.Collections.Generic; using System.Linq; using System.Reflection;/*引用反射的空间*/ using System.Text; using System.Threading.Tasks; namespace ConsoleAppModel03 { class Program { static void Main(string[] args) { Console.WriteLine("列出ConsoleAppModel03.exe程序集的所有类型"); //加载程序集 Assembly ass = Assembly.LoadFrom("ConsoleAppModel03.exe"); Type classobj = null; //获取定义的类型 Type[] types = ass.GetTypes(); foreach(Type t in types) { Console.WriteLine(t.Name); if (t.Name == "TestClass") { classobj = t; } } Console.WriteLine("列出TestClass的所有公共方法"); //返回当前Type的所有公共方法。 MethodInfo[] mif = classobj.GetMethods(); foreach(MethodInfo m in mif) { Console.WriteLine(m.Name); } Console.WriteLine("实例化TestClass的Erite()方法"); /*使用默认化结构对象*/ object obj = Activator.CreateInstance(classobj); /*使用有参数的结构对象*/ object nobj = Activator.CreateInstance(classobj,"LWW"); /*空重载方法*/ MethodInfo mi1 = classobj.GetMethod("Erite",new Type[]{}); /*有参数的重载方法*/ MethodInfo mi2 = classobj.GetMethod("Erite", new Type[] { typeof(string) }); //使用指定的对象,调用它的方法 mi1.Invoke(obj,null); mi1.Invoke(nobj,null); Console.WriteLine("调用有参数重载的方法"); object[] obpars = new object[1]; obpars[0] = "123456"; mi2.Invoke(obj,obpars); mi2.Invoke(nobj, new object[]{"123"}); Console.ReadLine(); } } }
ps:懂得不多,感觉上可以外部调用任何。net的程序集,完成本地加载的操作。
关于equas和==:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleAppModel04 { class Program { static void Main(string[] args) { string s1 = "test"; string s2 = "test"; Console.WriteLine("测试string 与 string"); Console.WriteLine(s1==s2);//true Console.WriteLine(s1.Equals(s2));//true char[] c = new char[] { 't', 'e', 's', 't' }; string s11 = new string(c); string s22 = new string(c); Console.WriteLine("测试string 与 string"); Console.WriteLine(s11 == s22);//true Console.WriteLine(s11.Equals(s22));//true object o1 = s1; object o2 = s2; Console.WriteLine("测试object 与 object"); Console.WriteLine(o1 == o2);//true Console.WriteLine(o1.Equals(o2));//true string s3=new string(new char[]{'t','e','s','t'}); string s4=new string(new char[]{'t','e','s','t'}); Console.WriteLine("测试new 的string"); Console.WriteLine(s3==s4);//true Console.WriteLine(s3.Equals(s4));//true /*隐示的创建了o3 同object o3 = new object(); o3 = s3;*/ object o3 = s3; object o4 = s4; Console.WriteLine("1111111111测试object被赋值new string"); Console.WriteLine(o3==o4);//false Console.WriteLine(o3.Equals(o4));//true User u1 = new User("lww"); User u2 = new User("lww"); Console.WriteLine("测试两个new user"); Console.WriteLine(u1==u2);//false Console.WriteLine(u1.Equals(u2));//false User u3 = new User("lww"); User u4 = u3; Console.WriteLine("测试赋值的user"); Console.WriteLine(u3==u4);//true Console.WriteLine(u3.Equals(u4));//true Console.ReadKey(); } } public class User { public User() { } public User(string str) { this.name = str; } public string name { get; set; } public int age { get; set; } } }
关于const和readonly
const是运行时常数,readonly是运行时常数
const在编译的时候需要有一个确定的值,而readonly则不需要,即const为常数,readonly可以是变量,readonly好比是一个恒定的表达式
访问符盘点
private public protected internal的区别
private 完全私有 子类不能调用
protected 保护 外界不能调用 可以被继承 所以在子类可以调用
public 公共 无限制
internal 同一程序集调用 不能夸程序集而public则可以