如何通过反射调用普通类中的泛型方法?(有重载)

问题描述

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Reflection;namespace复习{classProgram{staticvoidMain(string[]args){Typet1=typeof(Person);MethodInfomi1=t1.GetMethod("SayHello",BindingFlags.NonPublic|BindingFlags.Instance,null,newType[]{},null);MethodInfomi2=t1.GetMethod("SayHello",BindingFlags.NonPublic|BindingFlags.Instance,null,newType[]{typeof(String)},null);MethodInfomi3=t1.GetMethod("SayHello",BindingFlags.NonPublic|BindingFlags.Instance,null,newType[]{typeof(String),typeof(Int32)},null);//如何分别反射以下三个方法?//privatevoidSayHello<T1,T2,T3>(T1t1,T2t2,T3t3)//privatevoidSayHello<T1>(T1t)//privatevoidGM1<T1>(T1t)objectobj1=Activator.CreateInstance(t1);//开始调用//Console.ReadKey();}}classPerson{privatevoidSayHello(){Console.WriteLine("我是一个无参的方法");}privatevoidSayHello(strings){Console.WriteLine("我是一个有参的方法,参数:{0}",s);}privatevoidSayHello(strings,inti){Console.WriteLine("我是一个有两个参数的方法,参数:{0}、{1}",s,i);}privatevoidSayHello<T1,T2,T3>(T1t1,T2t2,T3t3){Console.WriteLine(t1.ToString()+t2.ToString()+t3.ToString());}privatevoidSayHello<T1>(T1t){Console.WriteLine(t.ToString());}privatevoidGM1<T1>(T1t){Console.WriteLine(t.ToString());}}}

解决方案

解决方案二:

解决方案三:
以下是调用PM1的示例:Personp=newPerson();Typet=p.GetType();MethodInfomi=t.GetMethod("GM1",BindingFlags.NonPublic|BindingFlags.Instance);MethodInfomi2=mi.MakeGenericMethod(newType[]{typeof(string)});mi2.Invoke(p,newobject[]{"abcdefg"});

解决方案四:
参考:
解决方案五:
markmark
解决方案六:
标个记号回头来看
解决方案七:
C#类成员分Field、Property和Method三种,Field通过名称就可以直接通过反射获取,后两种需要加上参数类型才能唯一确定,以Method为例,不同方法名称相同而参数不同是允许的(重载),但反射时就比较麻烦了。classProgram{staticvoidMain(string[]args){Typet1=typeof(Person);MethodInfomi1=GetMethod(t1,"SayHello");MethodInfomi2=GetMethod(t1,"SayHello",typeof(string));MethodInfomi3=GetMethod(t1,"SayHello",typeof(int));//如何分别反射以下三个方法?//privatevoidSayHello<T1,T2,T3>(T1t1,T2t2,T3t3)MethodInfomi4=GetGenericMethod(t1,"SayHello",typeof(string),typeof(string),typeof(int));//privatevoidSayHello<T1>(T1t)MethodInfomi5=GetGenericMethod(t1,"SayHello",typeof(string));//privatevoidGM1<T1>(T1t)MethodInfomi6=GetGenericMethod(t1,"GM1",typeof(string));}staticMethodInfoGetMethod(Typetype,stringname,paramsType[]types){returntype.GetMethod(name,BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance,null,types,null);}staticMethodInfoGetGenericMethod(Typetype,stringname,paramsType[]types){foreach(MethodInfomiintype.GetMethods(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance)){if(mi.Name!=name)continue;if(!mi.IsGenericMethod)continue;if(mi.GetGenericArguments().Length!=types.Length)continue;returnmi.MakeGenericMethod(types);}thrownewMissingMethodException();}}classPerson{privatevoidSayHello(){Console.WriteLine("我是一个无参的方法");}privatevoidSayHello(strings){Console.WriteLine("我是一个有参的方法,参数:{0}",s);}privatevoidSayHello(strings,inti){Console.WriteLine("我是一个有两个参数的方法,参数:{0}、{1}",s,i);}privatevoidSayHello<T1,T2,T3>(T1t1,T2t2,T3t3){Console.WriteLine(t1.ToString()+t2.ToString()+t3.ToString());}privatevoidSayHello<T1>(T1t){Console.WriteLine(t.ToString());}privatevoidGM1<T1>(T1t){Console.WriteLine(t.ToString());}}

这里没考虑泛型方法带非泛型参数的情况,如果需要可自己琢磨。
解决方案八:
也许可以利用dynamic的语法糖?dynamicd=obj1asdynamic;d.SayHello<int,double,string>(0,1.0,"str");

时间: 2024-10-04 19:34:28

如何通过反射调用普通类中的泛型方法?(有重载)的相关文章

spring-通过类反射调用的类中,通过Spring @Autowired 装载失败

问题描述 通过类反射调用的类中,通过Spring @Autowired 装载失败 使用了@Autowired注释,自动装配成员变量,正常情况下没有问题,但是当这个类通过java的反射机制调用时,自动装配失败,成员变量时空值,出现空指针异常. 解决方案 已经解决了,不过觉得破坏了框架,可能真的没法办法吧,现在贴出来我自己解决的办法 //手动注入,防止反射无法注入 private void ManulInject(){ ApplicationContext apx=new ClassPathXmlA

Android反射出一个类中的其他类对象并调用其对应方法

MainActivity如下: package cn.testreflect; import java.lang.reflect.Field; import java.lang.reflect.Method; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 在一个类中有另外一个类的对象 * 比如此处的Worker类中有一个Student类的对象: * private Student mStudent;

内部类-Java编程中A类如何调用B类中M方法里的C类的实例?

问题描述 Java编程中A类如何调用B类中M方法里的C类的实例? import java.awt.*; import java.awt.event.*; public class TestListener{ public static void main(String[] args){ Counter c1 = new Counter("Hello"); c1.CreatButton(); c1.add(c1.button); ----------------------------(

如何反射取得一个类中的静态常量?

问题描述 如何反射取得一个类中的静态常量?如: public class User { public static final String teacher = "json"; private String id; private String name;...取得teacher怎么取呢? 解决方案 Class ownerClass = Class.forName("com....User"); Field field = ownerClass.getField(&

java-HTML中js如何调用C#类中的方法

问题描述 HTML中js如何调用C#类中的方法 js代码: //搜索跳转至中转页 function Search(id) { var Sou1 = document.getElementById('Sou1') var T1 = Sou1.value; if (id == "1") { if (Sou1.value != "") { top.location.href = 'web/Search.aspx?S=1&T=' + T1; } } } C#类代码:

怎么实现javascript中调用java类中的方法

问题描述 body中部分代码如:<center><font size="4" color="red">吊灯</font> <input type="button" id="diaodeng" value=<%=state[0]%> onclick="dianji1()"><br><br><br><br>

PHP通过反射方法调用执行类中的私有方法

PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 下面我们演示一下如何通过反射,来调用执行一个类中的私有方法: <?php   //MyClass这个类中包含了一个名为myFun的私有方法 class MyClass {         private $tmp = 'hello';         private function myFun()     {         echo $this->tmp . ' ' . 'world!';    

推荐一个快速反射调用的类

本文转载:http://blog.csdn.net/jehnjehn/article/details/7086863   使用传统的.net反射机制,调用类的方法时,在调用频率大的情况下,会感觉速度很慢.最近浏览卢彦的博客时,找到一个他改进后的反射调用类.试用以后感觉效率明显提高,特推荐给大家.作者重新实现了,反射调用方法,但是调用接口和.net原有方法一致.而且调用时抛出的异常为所调用类的实际异常,不像传统方式返回为包装异常.文章来源:http://www.codeproject.com/cs

SQL Server中调用C#类中的方法实例(使用.NET程序集)_MsSql

需求是这样的,我在.net程序里操作数据时将一些字段数据加密了,这些数据是很多系统共用的,其中一delphi程序也需要用到,并且需要将数据解密,由于我在.net里加密的方式比较特殊,在delphi程序里解密比较繁琐且要消耗很多时间,所以不得不让sqlserver调用程序集的方式来解决问题. 下面只是一个例子,贴出来共享. 建立一个dll,class,代码如下: 复制代码 代码如下: namespace MyDll {     public partial class MyClass     {