C#通过反射调用类及方法
反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类)。下面演示一下通过反射调用类及方法:
1、新建一个类,命名为:ReflectionHelper,代码如下:
#region 创建对象实例
/// <summary>
/// 创建对象实例
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="assemblyName">程序集名称</param>
/// <param name="nameSpace">命名空间</param>
/// <param name="className">类名</param>
/// <returns></returns>
public static T CreateInstance<T>(string assemblyName, string nameSpace, string className)
{
try
{
//命名空间.类名,程序集
string path = nameSpace + "." + className + "," + assemblyName;
//加载类型
Type type = Type.GetType(path);
//根据类型创建实例
object obj = Activator.CreateInstance(type, true);
//类型转换并返回
return (T)obj;
}
catch
{
//发生异常时,返回类型的默认值。
return default(T);
}
}
#endregion
#region 调用方法实例
/// <summary>
/// 调用方法实例
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="assemblyName">程序集名称</param>
/// <param name="nameSpace">命名空间</param>
/// <param name="className">类名</param>
/// <returns></returns>
public static T GetInvokeMethod<T>(string assemblyName, string nameSpace, string className, string methodName, object[] paras)
{
try
{
//命名空间.类名,程序集
string path = nameSpace + "." + className + "," + assemblyName;
//加载类型
Type type = Type.GetType(path);
//根据类型创建实例
object obj = Activator.CreateInstance(type, true);
//加载方法参数类型及方法
MethodInfo method = null;
if (paras != null && paras.Length > )
{
//加载方法参数类型
Type[] paratypes = new Type[paras.Length];
for (int i = ; i < paras.Length; i++)
{
paratypes[i] = paras[i].GetType();
}
//加载有参方法
method = type.GetMethod(methodName, paratypes);
}
else
{
//加载无参方法
method = type.GetMethod(methodName);
}
//类型转换并返回
return (T)method.Invoke(obj, paras);
}
catch
{
//发生异常时,返回类型的默认值。
return default(T);
}
}
#endregion
2、新建一个WinForm窗体,命名为Main,添加两个按钮。

3、新建一个WinForm窗体,命名为Form2。

4、Form2窗体的代码如下:
public string SayHello()
{
return "Hello World.";
}
5、Main窗体的代码如下:
/// <summary>
/// 调用窗体2
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
Form form2 = ReflectionHelper.CreateInstance<Form>("LinkTo.Test.WinForm", "LinkTo.Test.WinForm.Reflection", "Form2");
form2.ShowDialog();
} /// <summary>
/// 调用窗体2的SayHello方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
string result = ReflectionHelper.GetInvokeMethod<String>("LinkTo.Test.WinForm", "LinkTo.Test.WinForm.Reflection", "Form2", "SayHello", null);
MessageBox.Show(result, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
C#通过反射调用类及方法的更多相关文章
- C#如何通过反射调用类下的方法
首先模拟一个mvc的项目,创建一个业务类(HomeService),在类下创建3个方法 public class HomeService { /// <summary> /// 无参方法 ...
- C# 利用反射调用类下的方法
namespace TestReflection { public partial class Form1 : Form { public Form1() { InitializeComponent( ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
- Java动态调用类中方法
在Java中,调用类的方法有两种方式:对于静态方法可以直接使用类名调用,对于非静态方法必须使用类的对象调用.反射机制提供了比较另类的调用方式,可以根据需要指定要调用的方法,而不必在编程时确定.调用的方 ...
- java利用反射调用类的某个方法
java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...
- 动态修改字节码以替换用反射调用get set方法的形式
1. 起因 在前两天,为了解决websphere和JDK8上部署的应用发起webservice调用(框架用的cxf)时报错的问题,跟了一些代码,最终发现可以通过加上参数-Dcom.sun.xml.bi ...
- php反射获取类和方法中的注释
通过php中的反射机制,获取该类的文档注释,再通过获取其所有的方法,获取方法的注释 所用到的主要类及其方法 ReflectionClass ReflectionClass::getDocComment ...
- Spring事务调用类自己方法失效解决办法和原因
问题 正常情况下,我们都是在controller里调用service里的方法,这个方法如果需要加事务,就在方法上加上@Transactional,这样是没问题的,事务会生效. 可是如果像下面这样,绕以 ...
- java 使用反射调用可变参数方法
使用反射操作对象-调用可变参数方法 要把可变参数都当做是其对应的数组类型参数; 如 show(XX... is)作为show(XX[] is)调用; 若可变参数元素类型是引用类型: JDK内部接收到参 ...
随机推荐
- Spring Securtiy 认证流程(源码分析)
当用 Spring Security 框架进行认证时,你可能会遇到这样的问题: 你输入的用户名或密码不管是空还是错误,它的错误信息都是 Bad credentials. 那么如果你想根据不同的情况给出 ...
- python中for循环删除不全的问题
以前遇到过一次,删除列表中符合条件的元素,for循环挨个判断是否符合条件,符合就删除,删完结果发现有一个符合条件的没有删掉. 那么如果想删除某些列表中的元素,比如有一个a列表,a=[11,22,33, ...
- python sympy evalf()函数
SymPy是一个符号计算的Python库.它的目标是成为一个全功能的计算机代数系统,同时保持代码简 洁.易于理解和扩展.它完全由Python写成,不依赖于外部库.SymPy支持符号计算.高精度计算.模 ...
- Selenium之单选框操作
单选框操作: 何为单选框?就是永远只能选中一个选项的意思.一般单选框的图标都是呈圆形的.我们通过selenium可直接定位到被选中的选项上,然后用click方法实现点击. 下面附上一段rb.html代 ...
- Lamada表达式小技巧介绍
函数式编程 @FunctionalInterface interface Lf{ void dispaly(); } @FunctionalInterface为显示定义函数时编程接口,不符合函数式编程 ...
- 【Eureka】服务发现调用
[Eureka]服务发现调用 转载:https://www.cnblogs.com/yangchongxing/p/10779832.html 1.使用 Netfix Feign 客户端调用服务 首先 ...
- Test1016
T1 kom (容斥 \((1s32M)\) 给出\(N\)个互不相同的正整数,统计共有多少对数,它们有公共的一个数字(不一定在同一位置上) 输入 第一行一个正整数 \(N (1 ≤ N ≤ 1 00 ...
- Java8 Stream —— 更丝滑的集合操作方式
一.概念 Stream是一种可供流式操作的数据视图有些类似数据库中视图的概念它不改变源数据集合如果对其进行改变的操作它会返回一个新的数据集合. 总的来讲它有三大特性:在之后我们会对照着详细说明 ...
- LINUX网络传输的序列化和反序列化C++
来到公司实习,开始面向实习生有一个小项目,当然了,服务器就由我一个人来写了,1.0主要完成的使用纯C 写Linux下UDP的服务器框架,大部分还都是以前在学校做过的项目套用的,难度不大,经过跟大bos ...
- 【高可用架构】用Nginx实现负载均衡(三)
前言 在上一篇,已经用Envoy工具统一发布了Deploy项目代码.本篇我们来看看如何用nginx实现负载均衡 负载均衡器IP 192.168.10.11 [高可用架构]系列链接:待部署的架构介绍 演 ...