反射如何执行 IList<T>.Add方法?

问题描述

usingSystem;usingSystem.Collections.Generic;usingSystem.Collections;usingSystem.Linq;usingSystem.Text;//需要引用Json.net的类库。http://www.newtonsoft.com/json可以下载,也可以屏蔽代码中演示用的json解析部分//usingNewtonsoft.Json;//usingNewtonsoft.Json.Linq;//usingNewtonsoft.Json.Serialization;usingSystem.Reflection;usingSystem.Diagnostics;namespaceqq20662.WeiXin.Tests.Models{//IList反射的操作的演示,请查看标有??????的行次。//IList反射不出Add方法。奇怪。publicclassReflectionIList{publicvoidtest1(){//如果普通生成可以这样:AAa1=newAA();a1.Ap1="xx";BB_1b1=newBB_1();b1.Bp1=115;BB_2b2=newBB_2();b2.Bp1=171;//注意这里可以替换为其他实现了IList接口的用户自定义类a1.AaBb=newList<IBB>();a1.AaBb.Add(b1);a1.AaBb.Add(b2);//如何通过反射生成AA的对象。//当AaBb中无法确定使用那个具体类来实例化,允许直接使用BB_1stringjString=@"{""Ap1"":""xx"",""AaBb"":[{""Bp1"":115},{""Bp1"":171}]}";//假定已经把json全部解析完毕了。这几行可以屏蔽//JObjectjo=JObject.Parse(jString);Debug.Print(typeof(AA).Assembly.GetName().Name);//这里可以得到qq20662.WeiXin.Tests,在每个人的项目中都不一样的,可以复制出来,下面要用的Debug.Print(typeof(AA).FullName);//这里可以得到qq20662.WeiXin.Tests.Models.AA,在每个人的项目中都不一样的,可以复制出来,下面要用的//假定可以用工厂模式从配置文件加载AA的typefullnameobjectoa1=Activator.CreateInstance(Assembly.Load("qq20662.WeiXin.Tests").GetType("qq20662.WeiXin.Tests.Models.AA"));//获取oa1的所有属性PropertyInfo[]props=oa1.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance);foreach(PropertyInfopropinprops){//这里可以与json做匹配,看属性名是否符合。//比较简单,就忽略了。if(prop.Name=="AaBb"){Typet2=prop.PropertyType.GetGenericArguments().First();//得到泛型中的类型,如IBBType[]typeArgs={t2};//生成泛型参数//假定提供参数,可以用List<>来实现IList接口TypealgTypeGen=typeof(List<>);//生成列表TypealgType=algTypeGen.MakeGenericType(typeArgs);//生成具体的泛型列表。objectoAaBb=Activator.CreateInstance(algType);//下面省略用反射获取BB_1类型的对象。基本根上面差不多,可以用工厂类根据json和预先设置的字符串来返回实例BB_1b3=newBB_1();b3.Bp1=9999;MethodInfoaddMethod=prop.PropertyType.GetMethod("Add");//??????下面这行就比较奇怪了,按道理IList的属性应该有Add方法,但是这里返回的是null,未获取到。Debug.Print((addMethod==null).ToString());//这里返回true表示没有add方法,奇怪。MethodInfo[]ms=prop.PropertyType.GetMethods();foreach(MethodInfomIteminms){Debug.Print(mItem.Name);}//??????上面循环的输出结果是下面这些。//get_Item//set_Item//IndexOf//Insert//RemoveAt//下面这行的返回值是System.Collections.Generic.IList`1[[qq20662.WeiXin.Tests.Models.IBB,qq20662.WeiXin.Tests,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]]//应该是对的,那Add方法到哪里去了?IList.Add方法应该有的呀?Debug.Print(prop.PropertyType.FullName);}}}}publicclassAA{publicstringAp1;protectedIList<IBB>_aaBb;publicIList<IBB>AaBb{get{return_aaBb;}set{_aaBb=value;}}}publicinterfaceIBB{intBp1{get;set;}voidAdd();}publicclassBB_1:IBB{publicintBp1{get;set;}publicvoidAdd(){}}publicclassBB_2:IBB{publicintBp1{get;set;}publicvoidAdd(){}}}

解决方案

解决方案二:
看到版主勋章,我还以为这是教学帖呢
解决方案三:
MethodInfoaddMethod=prop.PropertyType.GetMethod("Add");改为:MethodInfoaddMethod=oAaBb.GetType().GetMethod("Add");
解决方案四:
看了下你的数据类型定义“publicIList<IBB>AaBb”,你这个是定义的接口啊,因此你的prop.PropertyType是IList而不是List,两个完全不同的类型,虽然有继承关系,但实际需要反射的是继承后的List类的Add方法,对接口类型本身进行反射是得不到任何执行方法的。
解决方案五:
二楼说得对,我看了元数据,的确是,那我应该如何才能用反射实现IList的add方法呢?即使他是继承的,总能用反射实现吧?

时间: 2024-09-20 00:36:14

反射如何执行 IList&amp;lt;T&amp;gt;.Add方法?的相关文章

Yii框架在页面输出执行sql语句以方便调试的实现方法_php实例

本文实例讲述了Yii框架在页面输出执行sql语句以方便调试的实现方法.分享给大家供大家参考.具体分析如下: 我们使用:yiidebugtb来调试(因为用他界面比较美观,不影响界面其他元素). 1.下载yiidebugtb,并且放入到 application.extensions.yiidebugtb 目录 2.修改main.php,加入如下代码: 复制代码 代码如下: 'log'=>array(     'class'=>'CLogRouter',     'routes'=>array

js中confirm实现执行操作前弹出确认框的方法_javascript技巧

本文实例讲述了js中confirm实现执行操作前弹出确认框的方法.分享给大家供大家参考.具体实现方法如下: 现在在删除或其它操作前弹出确定提示,我们有很多方法,最基本的就是利用js自带的函数confirm来操作了 最简单的用法如下: 鼠标事件使用confirm 复制代码 代码如下: <a href="#" onclick= "if(confirm( '是否确定! ')==false)return   false; ">点击确定</a> 想简单

php+mysqli实现批量执行插入、更新及删除数据的方法_php技巧

本文实例讲述了php+mysqli实现批量执行插入.更新及删除数据的方法.分享给大家供大家参考.具体如下: mysqli批量执行插入/更新/删除数据,函数为 multi_query(). 下面的代码只是批量插入数据,事实上,插入数据.更新数据.删除数据等可以混合一起执行.查询时使用该函数,读取数据有点不太一样,具体参考如下代码: <?php //1.创建数据库连接对象 $mysqli = new MySQLi("localhost","root","

执行文件方式加密FLASH文件的解密方法

工具:OD Lordpe 16进制编辑器 程序:多彩的夏天.exe 目的:从EXE文件中导出SWF,之后可以进行反编及修改操作 说明:为了研究需要而处理的.不敬之处请您谅解. 1.OD导入程序. 停在这里 004B556B > $ 6A 60 PUSH 60 004B556D . 68 30805300 PUSH 多彩夏天.00538030 004B5572 . E8 E9EBFFFF CALL 多彩夏天.004B4160 004B5577 . BF 94000000 MOV EDI,94 00

用反射调用别人的.NET程序里的类和方法

程序 如果想复用别人写的.NET程序但手上只有一个编译过的EXE,那么方法之一是用Reflection(反射).下面是一些例子,初次上手的人可以参考. 先假设我们要复用的第三方应用程序EXE是由下面的代码编译成的: using System;namespace MyNamespace{ public class MyApp { public MyNestedObject myNestedObject=null; public class MyNestedObject{ public string

批量删除数据后, 未释放empty索引页导致mergejoin执行计划变慢 case - 分析与规避方法

标签 PostgreSQL , merge join , min , max , 优化器 , 索引倾斜 , 垃圾回收 背景 PostgreSQL支持三种JOIN的方法,nestloop, merge, hash. 这三种JOIN方法的差别和原理可以参考 https://www.postgresql.org/docs/devel/static/planner-optimizer.html <PostgreSQL nestloop/hash/merge join讲解> nested loop jo

.Net core下直接执行SQL语句并生成DataTable的实现方法_实用技巧

.net core可以执行SQL语句,但是只能生成强类型的返回结果.例如var blogs = context.Blogs.FromSql("SELECT * FROM dbo.Blogs").ToList().而不允许返回DataSet.DataTable等弱类型.可能由于这个原因没有实现在.net core中DataTable,然而DataTable还是可能会用到的.我们这里就有一个数据仓库的需求,允许用户自行编写类似SQL语句,然后执行,以表格展示.因为语句是千变万化的,因此我也

java自定义任务类定时执行任务示例 callable和future接口使用方法_java

Callable 和 Future接口Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务. Callable和Runnable有几点不同: (1)Callable规定的方法是call(),而Runnable规定的方法是run().(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的. (3)call()方法可抛出异常,而run()方法是不能抛出异常的.(4)运行Callable任务可拿到一

如何执行一套数据推动的云迁移方法

对于当前几乎所有行业的各种规模的企业组织机构而言,迁移到云计算早已经不再是一个新的趋势--而是一项势在必行的计划了.根据市场调研机构Gartner公司最近的研究显示,"预计在未来几年,企业云策略将达到没有采用云服务就像不能上网一样罕见的一个境地."Gartner公司的研究副总裁杰弗里·曼恩表示说,"甚至是那些曾经主要取决于客户而定制设计的软件,也将逐步迁移到云中." 对于这一在全球范围内的各行各业都在掀起的从企业内部部署的IT迁移到基于云服务的IT的趋势,实在没有什