技术开发 频道

.NET反射技术封装

  【IT168 技术文档】如果有人问你,如何调用一个类的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);
        }
    }
}
0
相关文章