C# 反射的乌云,MethodInfo的Json序列化参数入参问题

前言

我上篇文章已经基本解决了反射的基本问题,现在只留下了一乌云,就是Json化对象如何转化为MethodInfo 的参数入参

C# 反射的终点:Type,MethodInfo,PropertyInfo,ParameterInfo,Summry

但是反射的问题还有一朵解决不了的乌云,Json字符串参数入参MethodInfo。

直接运行MethodInfo

我们直接写一个简单的函数

在这里插入图片描述

        /// <summary>
        /// 
        /// </summary>
        /// <param name="age"></param>
        /// <param name="name"></param>
        /// <param name="person"></param>
        public void TestParamters(int age, string name, T_Person person)
        {
   
   
            Console.WriteLine(JsonConvert.SerializeObject(new {
   
    age = age, name = name, person = person }));
        }
static void Main(string[] args)
{
   
   
    //从程序集中拿出
    SwitchService switchService = new SwitchService();
    var method = typeof(SwitchService).GetMethod("TestParamters");

    if (method != null)
    {
   
   


        //默认方法
        method.Invoke(switchService, new object[] {
   
    15, "小天", new T_Person() });
    }
    Console.WriteLine("运行完成!");
    Console.ReadKey();
}

运行结果

在这里插入图片描述
这个是非常好解决的,但是有个问题,我们运行反射的时候根本不知道如何入参的个数和类型。我们还需要解决Json到Paramters的问题

Json解决

ParamterInfo实例化


 static void Main(string[] args)
 {
   
   
     //从程序集中拿出
     SwitchService switchService = new SwitchService();
     var method = typeof(SwitchService).GetMethod("TestParamters");
     //需要反序列化的字符串
     var paramterStr = @"{""age"":0,""name"":null,""person"":{""Name"":null,""Age"":0,""Sex"":null}}";

     if (method != null)
     {
   
   


         //默认方法
         method.Invoke(switchService, new object[] {
   
    15, "小天", new T_Person() });


         var parameterInfos = method.GetParameters();
         object[] methodParams = new object[parameterInfos.Length];
         for (int i = 0; i < parameterInfos.Length; i++)
         {
   
   
             var item = parameterInfos[i];
             //通过程序集创建实例化对象
             Type itemType = item.ParameterType;
             try
             {
   
   
                 //无法实例化无默认构造函数的方法
                 methodParams[i] = System.Activator.CreateInstance(itemType, true);

             }
             catch (Exception ex)
             {
   
   
                 Console.WriteLine(ex.ToString());
             }

         }
         method.Invoke(switchService, methodParams);
             //method.Invoke(switchService, new object[] { paramterStr });
         }

     //var methods = MyAttributeHelper.GetAllMethods<MySwitchAttribute>(typeof(SwitchService));
     Console.WriteLine("运行完成!");
     Console.ReadKey();
 }

运行结果

在这里插入图片描述

无法实例化问题部分参数的问题

Activator can’t create array and string?

在这里插入图片描述
在这里插入图片描述
简单来说,有些对象就是无法实例化的,默认只能为Null,

Json反序列化

但是我感觉我想的有点多了,我直接把Json对象拆分了不就行了。

但是Json反序列化有个问题,你必须要告诉他这个类是什么,他才能反序列化。就是我们要通过ParamterInfos给出反序列化的模型

TypeConverter.ConvertTo 方法

是否将Dictionary<string、object>转换为匿名对象?

因为Method.invoke必须参数的类型一致,而我默认直接转为Object类型,是有点问题的。

Error : Object must implement IConvertible

经过长达一天的研究,我终于完全的解决的了

安装Json序列化工具
在这里插入图片描述

实战思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值