当前位置: 首页 > 科技观察

C#Reflection入门C#反射实例

时间:2023-03-12 07:04:46 科技观察

C#Reflection的入门学习首??先,你必须明白C#Reflection提供了封装程序集、模块、类型等的对象。然后可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,则可以使用反射访问它们。MSDN描述:反射通常用于使用Assembly定义和加载程序集,加载程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。使用Module发现信息,例如包含模块的程序集、模块中的类等。您还可以获得模块上定义的所有全局方法或其他特定的非全局方法。使用ConstructorInfo可以发现有关构造函数的名称、参数、访问修饰符(例如public或private)、实现细节(例如抽象或虚拟)等的信息。使用Type的GetConstructors或GetConstructor方法调用特定的构造函数。使用MethodInfo可以发现方法的名称、返回类型、参数、访问修饰符(例如public或private)、实现细节(例如抽象或虚拟)等信息。使用Type的GetMethods或GetMethod方法调用特定方法。使用FieldInfo来发现字段名称、访问修饰符(例如public或private)和实现细节(例如static)等信息;并获取或设置字段值。使用EventInfo发现以下信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型、反映类型等;并添加或删除事件处理程序。使用PropertyInfo可以发现以下信息:属性的名称、数据类型、声明类型、反映类型以及只读或可写状态;并获取或设置属性值。使用ParameterInfo可以发现有关参数名称、数据类型、参数是输入参数还是输出参数、它在方法签名中的位置等信息。当您在应用程序域的仅反射上下文中工作时,使用CustomAttributeData了解自定义属性。使用CustomAttributeData,您不必创建属性实例来检查它们。System.Reflection.Emit命名空间的类提供了一种特殊形式的反射,使您能够在运行时生成类型。反射还可以用于创建一个称为流派浏览器的应用程序,它使用户能够选择一种流派,然后查看有关所选流派的信息。反射还有其他几种用途。JScript等语言编译器使用反射来构造符号表。System.Runtime.Serialization命名空间中的类使用反射来访问数据并确定要保留的字段。System.Runtime.Remoting命名空间中的类通过序列化间接使用反射。一个最简单的C#反射例子,先写类库如下://staticmethodwithonlyoneparameterpublicstaticvoidStaticWriteString(strings){Console.WriteLine("StaticWriteString:"+s);}//staticmethodwithnoparameterpublicstaticvoidNoneParaWriteString(){Console.WriteLine("NoParaWriteString");}}}使用命令行编译csc/t:est。libraryreflect编译生成ReflectTest.dll库文件。然后进行下面程序的编写:usingSystem;usingSystem.Reflection;classTestApp{publicstaticvoidMain(){Assemblyass;Typetype;Objectobj;Objectany=newObject();ass=Assembly.LoadFile(@"@"C:\Users\luogy\Desktop\1\ReflectionTest.dll"");type=ass.GetType("ReflectionTest.WriteTest");/*example1--------*/MethodInfomethod=type.GetMethod("WriteString");stringtest="test";inti=1;Object[]parametors=newObject[]{test,i};obj=ass.CreateInstance("ReflectionTest.WriteTest");method.Invoke(obj,//Instanceobjectoftheclassneedtobereflectparametors);//method.Invoke(any,parametors);//RuntimeError:classreferenceiswrong/*example2----------*/method=type.GetMethod("StaticWriteString");method.Invoke(null,newstring[]{"test"});method.Invoke(obj,newstring[]{"test"});method.Invoke(any,newstring[]{"test"});/*example3------------*/method=type.GetMethod("NoneParaWriteString");method.Invoke(null,null);Console.ReadKey();}}运行结果:学习C#反射的注意点:1、指定的类库文件必须使用绝对路径,不能使用相对路径(其实感觉有点不合理,不方便)2.19行,命名空间和类名必须一起指定3.例1中,要体现的类必须实例化,因为要使用的方法不是静态方法4.由于这个方法有两个参数,可以使用这个ObjectMethod指定参数,也可以直接写成method.Invoke(obj,newObject[]{"test",1});5.在示例2中,我们要使用的方法是一个静态方法。这时候在Invoke的时候,对于第一个One参数是忽略的,也就是我们写的什么都不会被调用,哪怕我们随便new一个Object之类的也行,当然不推荐这种写法。但是对应Example1,如果我们在Invoke的时候使用不一致类型的实例作为参数,就会导致运行时错误。6、第三个例子是调用无参静态方法的例子。这时候我们不需要指定这两个参数,直接使用null即可。还有一个问题,如果被调用的类是静态类,我们需要注意一个问题,我们肯定会想到一个问题,静态类不能被实例化,这个时候,我们不需要实例化的方法classinline31是的,直接使用Invoke即可实现,否则会出现运行时错误。出于同样的原因,只要我们传递正确的参数,第一个参数就会被忽略。C#反射和C#反射实例的相关内容就介绍到这里,希望对大家理解和学习C#反射和C#反射实例有所帮助。