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