C#访问或修改私有类、函数、变量、属性
public static class TypeUtil { public static Type? GetType(string assemblyName, string typePath) { var assembly = Assembly.Load(assemblyName); if (assembly == null) return null; return assembly.GetType(typePath); } public static ConstructorInfo? Constructor(string assemblyName, string typePath, Type[] parametersType) { return Constructor(GetType(assemblyName, typePath), parametersType); } public static ConstructorInfo? Constructor(Type type, Type[] parametersType) { if(type == null) return null; return type.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, parametersType); } public static object? CreateInstance(string assemblyName, string typePath, Type[] parametersType, object[] parameters) { return Constructor(GetType(assemblyName, typePath), parametersType)?.Invoke(parameters); } public static object? CreateInstance(Type type, Type[] parametersType, object[] parameters) { return Constructor(type, parametersType)?.Invoke(parameters); } public static MethodInfo? GetMethod(Type type, string methodName, Type?[] parametersType) { return parametersType == null ? type.GetMethod(methodName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) : type.GetMethod(methodName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, parametersType); } public static object? InvokeMethod(object instance, Type type, string methodName, Type[] parametersType, object[] parameters) { var method = GetMethod(type, methodName, parametersType); if(method == null) return null; return method.Invoke(instance, parameters); } public static PropertyInfo? GetProperty(Type type, string propertyName) { if(type == null) return null; return type.GetProperty(propertyName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); } public static object? GetPropertyValue(object instance, Type type, string propertyName) { if(instance == null) return null; return GetProperty(type, propertyName)?.GetValue(instance); } public static void SetProperty(object instance, Type type, string propertyName, object value) { GetProperty(type, propertyName)?.SetValue(instance, value); } public static FieldInfo? GetField(Type type, string fieldName) { if (type == null) return null; return type.GetField(fieldName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); } public static object? GetFieldValue(object instance, Type? type, string fieldName) { return GetField(type, fieldName)?.GetValue(instance); } public static void SetField(object instance, Type? type, string fieldName, object? value) { GetField(type, fieldName)?.SetValue(instance, value); }
使用参考代码:
public partial class App : Application { public App() { var obj = TypeUtil.CreateInstance(typeof(ClassA), new Type[] { typeof(string), typeof(string) }, new object[] { "张三", "学生" }); var name = TypeUtil.GetFieldValue(obj, obj.GetType(), "_name"); var id = TypeUtil.GetPropertyValue(obj, obj.GetType(), "Id"); TypeUtil.SetField(obj, obj.GetType(), "_name", "reset name"); TypeUtil.SetProperty(obj, obj.GetType(), "Id", 11); TypeUtil.SetField(obj, obj.GetType(), "MaxId", 11); var name1 = TypeUtil.InvokeMethod(obj, obj.GetType(), "GetDescription", null, null); TypeUtil.InvokeMethod(obj, obj.GetType(), "SetDescription", new Type[] { typeof(string) }, new object[] { "Des" }); ; } } public class ClassA { public int Id { get; set; } = 10; public string Name { get; private set; } string Description { get; set; } string _name; static int MaxId = 10; public ClassA(string name, string description) { this._name = name; this.Name = name; this.Description = description; } public string GetDescription() { return this.Name; } public void SetDescription(string description) { this.Description = description; } public static ClassA CreatInstance(string name, string des) { return new ClassA(name, des); } }
请食客慢慢享用