.net反射技术封装

如果有人问你,如何调用一个类的private的方法或访问一个类的私有成员,如果你不 知道反射的话,你会告诉他不可以。但是有了反射,这一切都成为可能。我有时候会想, 既然使用private来限制访问,为什么又要用反射去破坏这种限制呢?也许可以通过侧面 来解释这个问题,如果你要维护类的封装性,那请不要用反射,反射会破坏类的封装性。

但反正某些情况下,又会变得相当地有用,比如你有一个dll,其中很多类被声明为 internal,如果你要使用这些类,而又无法修改源代码的话,你就可以使用反射了,最近 总结了一下,对反射做了一个封装。由于代码比较简单,没有做注释。

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace UsefulUtility
{
    public class Invoker
    {
        private static BindingFlags flags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.IgnoreCase;

        public static Type GetType(Assembly asm, string typeFullName)
        {
            return asm.GetType(typeFullName);
        }

        public static Type GetInnerType(string hiddenTypeName, Type outerType)
        {
            Module typeModule = outerType.Module;
            return typeModule.GetType(hiddenTypeName);
        }

        public static MethodInfo GetMethod(Type type, string funcName, Type[] paramTypes)
        {
            if (paramTypes != null)
                return type.GetMethod(funcName, flags, null, paramTypes, null);
            else
                return type.GetMethod(funcName, flags);
        }

        public static MethodInfo GetMethod(Type type, string funcName)
        {
            return GetMethod(type, funcName, null);
        }

        public static object CallMethod(object obj, string funcName, params object[] parameters)
        {
            Type type = obj.GetType();
            MethodInfo method = GetMethod(type, funcName, GetTypesFromObjects(parameters));
            return method.Invoke(obj, parameters);
        }

        public static object CallStaticMethod(Type type, string funcName, params object[] parameters)
        {
            MethodInfo method = GetMethod(type, funcName, GetTypesFromObjects(parameters));
            return method.Invoke(null, parameters);
        }

        public static object GetProperty(object obj, string propertyName)
        {
            return GetProperty(obj, propertyName, null);
        }

        public static object GetProperty(object obj, string propertyName, params object[] index)
        {
            Type type = obj.GetType();
            return type.GetProperty(propertyName, flags).GetValue(obj, index);
        }

        public static object GetStaticProperty(Type type, string propertyName)
        {
            return GetStaticProperty(type, propertyName, null);
        }

        public static object GetStaticProperty(Type type, string propertyName, params object[] index)
        {
            return type.GetProperty(propertyName, flags).GetValue(null, index);
        }

        public static void SetProperty(object obj, string propertyName, object value)
        {
            SetProperty(obj, propertyName, value, null);
        }

        public static void SetProperty(object obj, string propertyName, object value, params object[] index)
        {
            Type type = obj.GetType();
            type.GetProperty(propertyName, flags).SetValue(obj, value, index);
        }

        public static void SetStaticProperty(Type type, string propertyName, object value)
        {
            SetStaticProperty(type, propertyName, value, null);
        }

        public static void SetStaticProperty(Type type, string propertyName, object value, params object[] index)
        {
            type.GetProperty(propertyName, flags).SetValue(null, value, index);
        }

        public static object GetField(object obj, string fieldName)
        {
            Type type = obj.GetType();
            return type.GetField(fieldName, flags).GetValue (obj);
        }

        public static object GetSaticField(Type type, string fieldName)
        {
            return type.GetField(fieldName, flags).GetValue (null);
        }

        public static void SetField(object obj, string fieldName, object value)
        {
            Type type = obj.GetType();
            type.GetField(fieldName, flags).SetValue(obj, value);
        }

        public static void SetStaticField(Type type, string fieldName, object value)
        {
            type.GetField(fieldName, flags).SetValue(null, value);
        }

        private static ConstructorInfo GetConstructor(Type type, Type[] paramTypes)
        {
            return type.GetConstructor(paramTypes);
        }

        public static object CreateInstance(Type type, Type[] paramTypes, params object[] parameters)
        {
            return GetConstructor(type, paramTypes).Invoke (parameters);
        }

        public static object CreateInstance(Type type, params object [] parameters)
        {
            return GetConstructor(type, GetTypesFromObjects (parameters)).Invoke(parameters);
        }

        private static Type[] GetTypesFromObjects(object[] objs)
        {
            Type[] types = new Type[objs.Length];
            for (int i = 0; i < types.Length; i++)
                types[i] = objs[i].GetType();
            return types;
        }

        public static void AddEventHandler(object obj, string eventName, MethodInfo method, object methodOwner)
        {
            EventInfo eventInfo = obj.GetType().GetEvent (eventName, flags);
            Delegate eventDeleg = Delegate.CreateDelegate (eventInfo.EventHandlerType, methodOwner, method);
            eventInfo.AddEventHandler(obj, eventDeleg);
        }

        public static void RemoveEventHandler(object obj, string eventName, MethodInfo method,object methodOwner)
        {
            EventInfo eventInfo = obj.GetType().GetEvent (eventName, flags);
            Delegate eventDeleg = Delegate.CreateDelegate (eventInfo.EventHandlerType, methodOwner, method);
            eventInfo.RemoveEventHandler(obj, eventDeleg);
        }
    }
}

时间: 2024-10-07 12:52:03

.net反射技术封装的相关文章

C# 反射技术应用

反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌.如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道. 1..NET可执行应用程序结构 程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构. 应用程序结构分为应用程序域-程序集-模块-类型-成员

Android中利用反射技术实现加减乘除

JAVA反射机制定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有 属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取 的信息以及动态调用对象的方法的功能称为java语言的反射机制. Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类: 在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和 方法:在运行时调用任意一个对象的方法:生成动态代理. 有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的

谈.NET反射的封装

.NET反射提供了在运行时获取对象类型元数据的途径,使程序可以动态地调用对象的属性.方法.动态性带来的代价是反射调用不像基于静态类型的直接调用那样简洁,且缺乏类型检查机制,失去了IDE智能提示,容易出错:于是,不少朋友尝试对.NET反射进行封装. 这个话题是仁者见仁,智者见智,这里我也谈谈自己对.NET反射封装的思路,请先看下面的示例代码: static void Main(string[] args) { Person liu = new Person("liu", 26); Ref

java反射技术(一)

java的反射技术功能十分强大,整理一些资料!! (如需转载,请注明出处!) Lesson: 检测类examing class 1.Retrieving Class Objects 获取一个Class对象(metadata) a,从对象的实例获取.Class c = mystery.getClass();//(return Class)b,从子类的实例获取TextField t = new TextField(); Class c = t.getClass(); Class s = c.getS

C#反射技术之读取和设置类的属性

要用C#反射技术的话,首先得引入System.Reflection 命名空间,这个命名空间里的类,具有动态加载程序集.类型,动态调用方法.设置和取得属性和字段的值.可以获取类型和方法的信息的功能. 要想对一个类型实例的属性或字段进行动态赋值或取值,首先得得到这个实例或类型的Type,微软已经为我们提供了足够多的方法. 1 Class MyClass 2 { 3 private int field; 4 public int Field 5 { 6 get 7 { 8 return this.fi

JAVA:将反射技术应用于工厂模式(Factory)和单例模式(Singleton)的简单代码

反射技术大量用于Java设计模式和框架技术,最常见的设计模式就是工厂模式(Factory)和单例模式(Singleton). 参考URL: http://blog.csdn.net/xiaohai798/article/details/11640427 用接口来沟通不同程序的开发进度,不必等上游程序写好代码之后,再注入后面流程的程序员.且在实现上,可以用配置文件灵活变更,而不用重编译整个项目. InterfaceTest.java: interface InterfaceTest { //基于接

Android基于反射技术实现的加减乘除运算示例_Android

本文实例讲述了Android基于反射技术实现的加减乘除运算.分享给大家供大家参考,具体如下: JAVA反射机制定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法

环信,将移动通讯技术封装成简单的API接口

摘要: 十年前,你想找人建个网站,对方坐地要价开口就是两万,现在你想建个网站,便宜的不到一百块钱就能搞定,像国外的WordPress和国内的Discuz! 这类开源项目,能让用户很方便地建个人 "十年前,你想找人建个网站,对方坐地要价开口就是两万,现在你想建个网站,便宜的不到一百块钱就能搞定,像国外的WordPress和国内的Discuz! 这类开源项目,能让用户很方便地建个人网站或社区论坛.现在的移动互联网很像十年前的PC互联网,研发一个App的成本普遍比较高,但已经有一些创业团队在提供基础服

Java利用反射自动封装成实体对象的方法_java

本文实例讲述了Java利用反射自动封装成实体对象的方法.分享给大家供大家参考.具体分析如下: 利用此方法的时候需要传递的参数的名称,必须以行号结尾,去掉行号就是属性名称,比如页面传递name+rowNo,那么实体对象的属性名应该为name.代码如下 复制代码 代码如下: //获取页面数据,自动封装成bean对象 public List getObjectList(Class clazz,String[] rowNos) throws Exception{         List objList