XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension

【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等

公开
关注 0 Fork 0 Star 0
UTF-8
using System;
using System.Reflection;

namespace XFEExtension.ReflectionExtension
{
    /// <summary>
    /// 反射拓展
    /// </summary>
    public static class ReflectionExtension
    {
        /// <summary>
        /// 获取方法默认参数
        /// </summary>
        /// <param name="method"></param>
        /// <returns></returns>
        public static object[] GetDefaultParameters(this MethodInfo method)
        {
            var parameters = method.GetParameters();
            var defaultParameters = new object[parameters.Length];
            for (int i = 0; i < parameters.Length; i++)
            {
                var paramType = parameters[i].ParameterType;
                defaultParameters[i] = paramType.IsValueType ? Activator.CreateInstance(paramType) : null;
            }
            return defaultParameters;
        }
        /// <summary>
        /// 获取某个类中的某个私有字段的值
        /// </summary>
        /// <typeparam name="T">类</typeparam>
        /// <param name="obj"></param>
        /// <param name="fieldName">字段名称</param>
        /// <returns></returns>
        public static T GetPrivateField<T>(this object obj, string fieldName)
        {
            var field = obj.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance);
            return (T)field.GetValue(obj);
        }
        /// <summary>
        /// 设置某个类中的某个私有字段的值
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="fieldName">字段名称</param>
        /// <param name="value">值</param>
        public static void SetPrivateField(this object obj, string fieldName, object value)
        {
            var field = obj.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance);
            field.SetValue(obj, value);
        }
        /// <summary>
        /// 获取某个类中的某个私有属性的值
        /// </summary>
        /// <typeparam name="T">类</typeparam>
        /// <param name="obj"></param>
        /// <param name="propertyName">属性名称</param>
        /// <returns></returns>
        public static T GetPrivateProperty<T>(this object obj, string propertyName)
        {
            var property = obj.GetType().GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Instance);
            return (T)property.GetValue(obj);
        }
        /// <summary>
        /// 设置某个类中的某个私有属性的值
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="propertyName">属性名称</param>
        /// <param name="value">值</param>
        public static void SetPrivateProperty(this object obj, string propertyName, object value)
        {
            var property = obj.GetType().GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Instance);
            property.SetValue(obj, value);
        }
        /// <summary>
        /// 获取某个类中的某个私有静态字段的值
        /// </summary>
        /// <typeparam name="T">类</typeparam>
        /// <param name="type"></param>
        /// <param name="fieldName">字段名称</param>
        /// <returns></returns>
        public static T GetPrivateStaticField<T>(this Type type, string fieldName)
        {
            var field = type.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Static);
            return (T)field.GetValue(null);
        }
        /// <summary>
        /// 设置某个类中的某个私有静态字段的值
        /// </summary>
        /// <param name="type"></param>
        /// <param name="fieldName">字段名称</param>
        /// <param name="value">值</param>
        public static void SetPrivateStaticField(this Type type, string fieldName, object value)
        {
            var field = type.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Static);
            field.SetValue(null, value);
        }
        /// <summary>
        /// 获取某个类中的某个私有静态属性的值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="type"></param>
        /// <param name="propertyName">属性名称</param>
        /// <returns></returns>
        public static T GetPrivateStaticProperty<T>(this Type type, string propertyName)
        {
            var property = type.GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Static);
            return (T)property.GetValue(null);
        }
        /// <summary>
        /// 设置某个类中的某个私有静态属性的值
        /// </summary>
        /// <param name="type"></param>
        /// <param name="propertyName">属性名称</param>
        /// <param name="value">值</param>
        public static void SetPrivateStaticProperty(this Type type, string propertyName, object value)
        {
            var property = type.GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Static);
            property.SetValue(null, value);
        }
        /// <summary>
        /// 调用某个类中的某个私有方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <param name="methodName">方法名称</param>
        /// <param name="parameters">传入的参数</param>
        /// <returns></returns>
        public static T InvokePrivateMethod<T>(this object obj, string methodName, params object[] parameters)
        {
            var method = obj.GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
            return (T)method.Invoke(obj, parameters);
        }
        /// <summary>
        /// 调用某个类中的某个私有方法
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="methodName">方法名称</param>
        /// <param name="parameters">传入参数</param>
        public static void InvokePrivateMethod(this object obj, string methodName, params object[] parameters)
        {
            var method = obj.GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
            method.Invoke(obj, parameters);
        }
        /// <summary>
        /// 调用某个类中的某个私有静态方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="type"></param>
        /// <param name="methodName">方法名称</param>
        /// <param name="parameters">传入参数</param>
        /// <returns></returns>
        public static T InvokePrivateStaticMethod<T>(this Type type, string methodName, params object[] parameters)
        {
            var method = type.GetMethod(methodName);
            return (T)method.Invoke(null, parameters);
        }
    }
}