c#利用反射Assembly 对类和成员属性进行操作

        protected static void test()
        {
            //获取程序集
            Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();//Assembly.LoadFrom("test.dll"); 

            //获取模块
            Module[] modules = assembly.GetModules();
            foreach (Module module in modules)
            {
                Console.WriteLine("module name:" + module.Name);
            } 

            //获取类
            Type type = assembly.GetType("Reflect_test.PurchaseOrderHeadManageModel", true, true); //命名空间名称 + 类名

            //创建类的实例
            object obj = Activator.CreateInstance(type, true);

            //获取私有字段
            FieldInfo[] myfields = type.GetFields(BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.Instance);
            for (int i = 0; i < myfields.Length; i++)
            {
                Console.WriteLine("字段名:{0},类型:{1}", myfields[i].Name, myfields[i].FieldType);
            }

            //获取公共属性
            PropertyInfo[] Propertys = type.GetProperties();
            for (int i = 0; i < Propertys.Length; i++)
            {
               // Propertys[i].SetValue(Propertys[i], i, null); //设置值
               // Propertys[i].GetValue(Propertys[i],null); //获取值
                Console.WriteLine("属性名:{0},类型:{1}",Propertys[i].Name,Propertys[i].PropertyType);
            }

            //构造函数集合
            ConstructorInfo[] myconstructors = type.GetConstructors();
            foreach (ConstructorInfo csinfo in myconstructors)
            {
                Console.WriteLine("ConstructorInfo:{0}",csinfo.Name);
                foreach (ParameterInfo pinfo in csinfo.GetParameters())//构造函数参数列表
                {
                    Console.WriteLine("Parameter:{0},{1}", pinfo.Name,pinfo.ParameterType);
                }
            }
            //公共方法,包括属性
            MethodInfo[] methods = type.GetMethods();
            foreach (MethodInfo method in methods)
            {
                //IsSpecialName:是否是属性
                if (!method.IsSpecialName)
                {
                   // Console.WriteLine("类型:" + method.Attributes);
                    Console.WriteLine("method name:" + method.Name);
                }
            }

            //调用静态方法
            int result = (int)type.InvokeMember("StaticPlus", BindingFlags.InvokeMethod, null, null, new object[] {2,3 });
            Console.WriteLine("调用静态方法-结果是:{0}",result);

            //调用非静态方法
            result = (int)type.InvokeMember("Plus", BindingFlags.InvokeMethod, null, obj, new object[] { 3, 4 });
            Console.WriteLine("调用非静态方法-结果是:{0}",result);

             EventInfo[] Myevents=type.GetEvents();
             foreach (EventInfo einfo in Myevents)
             {
                 Console.WriteLine("事件:{0}", einfo.Name);
             }
        }

 

时间: 2024-09-10 19:19:27

c#利用反射Assembly 对类和成员属性进行操作的相关文章

PHP中如何定义类及其成员属性与操作

 类的概念:类是具有相同属性和操作的一组对象的集合.它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和操作两个主要部分.在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和操作说明两个主要部分. 1.类的定义: i. 类的关键字定义使用class 1.定义一个空类 Class Person{}; 2.定义一个有成员属性和操作的类 Class Person{ 成员属性........ 操    作........ } 3.定义一个不能被继承的类,使用final

利用反射动态调用类成员

动态 (C#)利用反射动态调用类成员 使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args ); 参数 name String,它包含要调用的构造函数.方法.属性或字段成员的名称. - 或 - 空字符串 (""

(C#)利用反射动态调用类成员

动态 (C#)利用反射动态调用类成员 使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args ); 参数 name String,它包含要调用的构造函数.方法.属性或字段成员的名称. - 或 - 空字符串 (""

C#利用反射简化给类字段赋值

 这个例子主要的思路是建立一个类和数据库查询语句的字段结构是一致的 然后利用反射,直接用数据字段名称进行拼凑,给类对象的字段进行赋值 1.类的定义 namespace CCB_Donet.ClassFolder { public class FieldRuleInfo { public string gStrFNo; public string gStrFName; public string gStrFLock; public string gStrFCaption; public strin

高手指教:如何用C#的反射机制得到类的公有属性名?

问题描述 如题,比方说,我建立一个这样的类:ClassA{int_id;string_name;publicintId{get{return_id;}set{_id=value;}}publicstringName{get{return_name;}set{_name=value;}}}我该如何通过编程得到这个类的公有属性名"Id"以及"Name"? 解决方案 解决方案二:反射之动态获取类型成员并执行调用反射支持查找类型的信息,枚举类型的成员,执行对象的成员等与类型

Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据

  package me.test; import java.lang.reflect.*;  //导入反射需要的包 public class ReflectTest {  public static void main(String[] args)  throws  Exception  {       /*  下面通过反射完成对一个对象中成员的替换    *   并且执行执行私有方法     *   完成对 Poiont类的对象中所有的 String的对象的d换成x    *   并且类中无

反射 注解-Java利用反射执行框架注入类的非静态方法

问题描述 Java利用反射执行框架注入类的非静态方法 之前对代码做优化,利用了反射去执行指定类的指定方法: public static JsonResultVO callMethod(Class<?> className String methodName Class<?>[] paramClass Object[] param) { JsonResultVO resultVO = new JsonResultVO(); try { Method m = className.get

利用java反射机制调用类的私有方法(推荐)_java

试想一下,如果你可以轻易地调用一个类的私有方法,那么是不是说你的封装都失效了?最近在看java的反射机制,发现居然可以利用java的反射机制去调用其他类的私有方法,至于这能干什么,那就见人见智了.. 我写的一段简易实例代码如下: import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * @author thomaslwq * @version 创建时间:Sep 4, 201

利用反射,实现动态调用winform窗体!!

动态 实用前提:在WinForm程序中,通过主窗体的Menu打开不同的窗体我以前的做法:在Menu的Click事件中,创建打开窗体的对象实例这样的缺点,我不说了:)看看利用反射动态调用窗体对象的方法:private void CreateForm(string strName){ this.Cursor = Cursors.WaitCursor; string path=AssemblyName;//项目的Assembly选项名称 string name=strName; //类的名字 Form