Sun_Blue_Sky

菩提本无树,明镜亦非台,本来无一物,何处惹尘埃 寻求内心的平静
随笔 - 21, 文章 - 92, 评论 - 75, 阅读 - 10万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

反射类

Posted on   Sun_Blue_Sky  阅读(182)  评论(0编辑  收藏  举报

 

复制代码
代码
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Xml.Linq;
using System.Reflection;

/// <summary>
///Reflect 的摘要说明
/// </summary>
public static class Reflect
{
    
static BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic|BindingFlags.Instance;
    
/// <summary>
    
/// 根据程序集名称加载一个程序集
    
/// </summary>
    
/// <param name="asm">程序集名称</param>
    
/// <returns>程序集</returns>
    public static Assembly GetAssembly(string asm)
    {
        
return Assembly.Load(asm);
    }

    
/// <summary>
    
/// 根据路径加载程序集
    
/// </summary>
    
/// <param name="asmPath">Bin文件路径</param>
    
/// <returns>程序集</returns>
    public static Assembly GetAssemblyByPath(string asmPath)
    {
        
return Assembly.LoadFile(asmPath);
    }

    
/// <summary>
    
/// 返回一个对象类型
    
/// </summary>
    
/// <param name="asm">程序集</param>
    
/// <param name="objFullName">对象完全名称 namespace+classname</param>
    
/// <returns></returns>
    public static Type GetType(Assembly asm, string objFullName)
    {
        
return asm.GetType(objFullName, truetrue);
    }

    
/// <summary>
    
/// 创建一个对象实例
    
/// </summary>
    
/// <param name="asm">程序集</param>
    
/// <param name="objFullName">对象路径 namespace+classname</param>
    
/// <returns></returns>
    public static object CreateInstance(Assembly asm, string objFullName)
    {
        
return asm.CreateInstance(objFullName, true);
    }

    
/// <summary>
    
/// 初始化构造函数并返回对象类型实例
    
/// </summary>
    
/// <param name="type">对象类型</param>
    
/// <param name="paramTypes">构造函数参数类型</param>
    
/// <param name="parameters">构造函数参数</param>
    
/// <returns></returns>
    public static object CreateInstance(Type type, Type[] paramTypes, params object[] parameters)
    {
        
return GetConstructor(type, paramTypes).Invoke(parameters);
    }

    
/// <summary>
    
/// 初始化构造函数返回指定类型的对象实例
    
/// </summary>
    
/// <param name="type">对象类型</param>
    
/// <param name="parameters">构造函数参数</param>
    
/// <returns>对象类型实例</returns>
    public static object CreateInstance(Type type, params object[] parameters)
    {
        
return GetConstructor(type, GetTypesFromObjects(parameters)).Invoke(parameters);
    }
    
/// <summary>
    
/// 获得指定对象的方法对象
    
/// </summary>
    
/// <param name="type">对象类型</param>
    
/// <param name="method">方法名称</param>
    
/// <returns>方法对象</returns>
    public static MethodInfo GetMethod(Type type, string method)
    {
        
return type.GetMethod(method);
    }

    
/// <summary>
    
/// 获得指定对象的方法对象,区别重载
    
/// </summary>
    
/// <param name="type">对象类型</param>
    
/// <param name="method">方法名称</param>
    
/// <param name="types">参数类型: 如参数为0时,new Type[0]</param>
    
/// <returns>方法对象</returns>
    public static MethodInfo GetMethod(Type type, string method, params Type[] types)
    {
        
return type.GetMethod(method, types);
    }


    
/// <summary>
    
/// 执行方法(不区别重载)
    
/// </summary>
    
/// <param name="type">对象类型</param>
    
/// <param name="obj">对象实例</param>
    
/// <param name="method">方法名称</param>
    
/// <param name="parameters">参数集合</param>
    public static object RunInvoke(Type type, object obj, string methodName, object[] parameters)
    {
        MethodInfo method 
= GetMethod(type, methodName);
        
if (method != null)
            
return method.Invoke(obj, parameters);
        
return null;
    }


    
/// <summary>
    
/// 执行方法(区别重载),静态方法的话obj可以为null
    
/// </summary>
    
/// <param name="type">对象类型</param>
    
/// <param name="obj">对象实例</param>
    
/// <param name="method">方法名称</param>
    
/// <param name="types">方法参数类型</param>
    
/// <param name="parameters">方法参数</param>
    public static object RunInvoke(Type type, object obj, string methodName, Type[] types, object[] parameters)
    {
        MethodInfo method 
= GetMethod(type, methodName, types);
        
if (method != null)
        {
            
return method.Invoke(obj, parameters);
        }
        
return null;
    }

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

    
/// <summary>
    
/// 返回一个属性的值
    
/// </summary>
    
/// <param name="obj">对象实例</param>
    
/// <param name="propertyName">属性名称</param>
    
/// <param name="index">索引话属性的的可选索引值,无的话为null</param>
    
/// <returns>属性值</returns>
    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);
    
//}

    
/// <summary>
    
/// 返回一个静态属性值
    
/// </summary>
    
/// <param name="type">对象类型</param>
    
/// <param name="propertyName">属性名称</param>
    
/// <param name="index">索引话属性的的可选索引值,无的话为null</param>
    
/// <returns>属性值</returns>
    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);
    
//}

    
/// <summary>
    
/// 设置一个属性的值
    
/// </summary>
    
/// <param name="obj">对象实例</param>
    
/// <param name="propertyName">属性名称</param>
    
/// <param name="value">设置属性的值</param>
    
/// <param name="index">索引话属性的的可选索引值,无的话为null</param>
    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);
    
//}
    /// <summary>
    
/// 设置一个静态属性的值
    
/// </summary>
    
/// <param name="obj">对象类型</param>
    
/// <param name="propertyName">属性名称</param>
    
/// <param name="value">设置属性的值</param>
    
/// <param name="index">索引话属性的的可选索引值,无的话为null</param>
    public static void SetStaticProperty(Type type, string propertyName, object value, params object[] index)
    {
        type.GetProperty(propertyName, flags).SetValue(
null, value, index);
    }

    
/// <summary>
    
/// 获取字段的值
    
/// </summary>
    
/// <param name="obj">对象实例</param>
    
/// <param name="fieldName">字段名称</param>
    
/// <returns>字段值</returns>
    public static object GetField(object obj, string fieldName)
    {
        Type type 
= obj.GetType();
        
return type.GetField(fieldName, flags).GetValue(obj);
    }

    
/// <summary>
    
/// 获取一个静态字段的值
    
/// </summary>
    
/// <param name="type">对象类型</param>
    
/// <param name="fieldName">字段名称</param>
    
/// <returns>字段值</returns>
    public static object GetSaticField(Type type, string fieldName)
    {
        
return type.GetField(fieldName, flags).GetValue(null);
    }

    
/// <summary>
    
/// 设置一个公共字段的值
    
/// </summary>
    
/// <param name="obj">对象实例</param>
    
/// <param name="fieldName">字段名称</param>
    
/// <param name="value">要设置的值</param>
    public static void SetField(object obj, string fieldName, object value)
    {
        Type type 
= obj.GetType();
        type.GetField(fieldName, flags).SetValue(obj, value);
    }

    
/// <summary>
    
/// 设置一个静态字段的值
    
/// </summary>
    
/// <param name="type">对象类型</param>
    
/// <param name="fieldName">字段名称</param>
    
/// <param name="value">要设置的值</param>
    public static void SetStaticField(Type type, string fieldName, object value)
    {
        type.GetField(fieldName, flags).SetValue(
null, value);
    }

    
/// <summary>
    
/// 创建一个指定类型的公共构造函数构造器
    
/// </summary>
    
/// <param name="type">对象类型</param>
    
/// <param name="paramTypes">构造函数参数类型</param>
    
/// <returns></returns>
    private static ConstructorInfo GetConstructor(Type type, Type[] paramTypes)
    {
        
return type.GetConstructor(paramTypes);
    }

   

    
/// <summary>
    
/// 获得一个数组对象中所有元素的类型
    
/// </summary>
    
/// <param name="objs">对象数组</param>
    
/// <returns>类型数组</returns>
    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);
    }


}
复制代码

 

 

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示