C# 反射调用带参数的重载的泛型方法

本文介绍了如何在C#中使用反射调用带有参数的重载泛型方法,并提供了当遇到"不能对ContainsGenericParameters为True的类型或方法执行后期绑定操作"异常时的解决方法,通过示例代码详细阐述了解决过程。
部署运行你感兴趣的模型镜像

C# 反射调用带参数的重载的泛型方法。

以及调用时抛出:不能对 ContainsGenericParameters 为 True 的类型或方法执行后期绑定操作异常的解决办法。


话不多说,上代码!

  

  class Aa
    {
        public string CreateSql<T>()
        {
            return "Aa类无参泛型方法";
        }
        public string CreateSql<T>(T t)
        {
            return "Aa类单实体方法";
        }
        public string CreateSql<T>(List<T> t)
        {
            //List有2条数据
            string str = TReflection.GetSql<T>(t, this);
            return str;
        }
    }
    class Bb
    {
        public string CreateSql<T>()
        {
            return "Bb类无参泛型方法";
        }
        public string CreateSql<T>(T t)
        {
            return "Bb类单实体方法";
        }
        public string CreateSql<T>(List<T> t)
        {
            string str = TReflection.GetSql<T>(t, this);
            return str;
        }
    }

    class TReflection
    {
        //需要调用类中的单实体方法
        public static string GetSql<T>(List<T> t, Object _class)
        {
            MethodInfo[] pa = _class.GetType().GetMethods();//反射获得所有方法

            MethodInfo pi = null;
            foreach (MethodInfo method in pa)
            {
                if (method.ToString() == "System.String CreateSql[T](T)")//简单粗暴的获取想要的方法的对象
                {
                    pi = method;
                    break;
                }
            }

            /*
             *如果没有此句代码则会抛出:“不能对 ContainsGenericParameters 为 True 的类型或方法执行后期绑定操作。”的异常。
             *原因:因为调用泛型方法,方法自身的类型参数或任何封闭类型中必须不含泛型类型定义或开放构造类型。进行这种递归确认是很困难的。
             *      为方便起见,也为了减少错误,ContainsGenericParameters 属性提供一种标准方法来区分封闭构造方法(可以调用)和开放构造方法(不能调用)。
             *      如果 ContainsGenericParameters 属性返回 true,则方法不能调用。
             *作用:用类型数组的元素代替当前泛型方法定义的类型参数,并返回表示结果构造方法的 MethodInfo 对象。
             */
            pi = pi.MakeGenericMethod(new Type[] { typeof(T) });

            StringBuilder sb = new StringBuilder();
            foreach (T item in t)
            {
                object[] parament = new object[1];//一个参数
                parament[0] = item;
                sb.Append(pi.Invoke(_class, parament)); //调用方法
            }
            return sb.ToString();
        }
    }


结果:





您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值