首页 > 编程语言 >C#访问或修改私有类、函数、变量、属性

C#访问或修改私有类、函数、变量、属性

时间:2024-05-27 11:15:06浏览次数:24  
标签:return string C# Type 私有 BindingFlags type public 属性

    public static class TypeUtl
    {
        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 = TypeUtl.CreateInstance(typeof(ClassA), new Type[] { typeof(string), typeof(string) }, new object[] { "张三", "学生" });
            var name = TypeUtl.GetFieldValue(obj, obj.GetType(), "_name");
            var id = TypeUtl.GetPropertyValue(obj, obj.GetType(), "Id");
            TypeUtl.SetField(obj, obj.GetType(), "_name", "reset name");
            TypeUtl.SetProperty(obj, obj.GetType(), "Id", 11);
            TypeUtl.SetField(obj, obj.GetType(), "MaxId", 11);
            var name1 = TypeUtl.InvokeMethod(obj, obj.GetType(), "GetDescription", Array.Empty<Type>(), null);
            TypeUtl.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);
        }
    }

 

请食客慢慢享用

标签:return,string,C#,Type,私有,BindingFlags,type,public,属性
From: https://www.cnblogs.com/RedSky/p/18215093

相关文章

  • 通过vconfig命令配置VLAN
    #yuminstallvconfig 安装vconfig命令包#modprobe8021q加载8021q模块,若不支持8021q模块,则不支持VLAN#lsmod|grep-i8021q #vconfigaddeth0100 在eth0上配置VLAN100#vconfigaddeth0200 在eth0上配置VLAN200#vconfigset_flageth0.10011设置VLAN的REO......
  • QC2.0 3.0 4.0 的区别
    在我们日常的手机配件市场中,QC2.0、3.0、4.0这些术语频繁出现。不过,在与客户深入交流后,我发现许多人对这些术语及其背后的区别并不十分清楚。今天,我将为大家系统地梳理一下这些知识点。首先,我们先来明确一下这些术语的概念。QC,即QuickCharge,是由美国高通公司专为搭载Qualc......
  • C# 工厂模式学习
    工厂模式(FactoryPattern)是一种创建型设计模式,它提供了一种创建对象的接口,而不是通过具体类来实例化对象。工厂模式可以将对象的创建过程封装起来,使代码更具有灵活性和可扩展性。工厂模式有几种常见的实现方式:简单工厂模式(SimpleFactoryPattern):简单工厂模式通过一个工厂类......
  • PD还是QC?快充协议全解析
    摘自:https://zhuanlan.zhihu.com/p/646357568 快充技术在现代生活中的重要性不言而喻,它大大提高了充电效率,使人们可以在短时间内为设备充满电,从而提高生活和工作效率。同时,快速充电技术的发展也推动了电池技术、半导体材料技术等相关领域的进步,为科技创新提供了可能。然而,我们......
  • 性能优化陷阱之hash真的比strcmp快吗
    最近网上冲浪的时候看到有人分享了自己最近一次性能优化的经验。我向来对性能是比较敏感的,所以就点进去看了。然而我越看越觉得蹊跷,但本着“性能问题和性能优化要靠性能测试做依据”,我不能凭空怀疑别人吧,所以我做了完整的测试并写下了这篇文章。可疑的优化方案分享者遇到的问题......
  • 『vulnhub系列』BEELZEBUB- 1 96692f0bce834b9f85ce4fb6710ae52d
    『vulnhub系列』BEELZEBUB-1下载地址:https://www.vulnhub.com/entry/beelzebub-1,742/信息搜集:使用nmap扫描存活主机,发现主机开启了22和80端口nmap192.168.0.*访问80端口的web服务,发现是apache的默认页面使用dirsearch扫描目录dirsearch-u"http://192.168.0.140/"......
  • L4-202 二叉搜索树的2层结点统计(C++)
    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。将一系列数字按给定顺序插入一棵初始为空的二叉搜......
  • P3406 海底高铁(C++)
    海底高铁题目描述该铁路经过NNN个城市,每个城市都有一个站。不过,由于各个城市之间不能协调好,于是乘车每经过两个相邻的城市之间(方向不限),必须单独购买这一小段的车票。......
  • 深度剖析整型和浮点型数据在内存中的存储(C语言)
    目录整型在内存中的存储为什么整型在内存中存储的是补码?大小端字节序为什么有大端小端?浮点型家族浮点数在内存中的存储longlong整型在内存中的存储    整型在内存中有三种二进制表示形式:原码,反码,补码。对于正数而言,三种形式均有符号位和数值位两部分(最高......
  • n-皇后问题(c++)
    ......