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内部接收到参 ...
随机推荐
- 怎么解决js中如滑动到最底端一次操作触发多次
定义一个布尔类型到标志,处理中将起设置为true ,处理完改完false,逻辑: data{ isInProcessing:false } //逻辑函数过程中: if(isInProcessing){ ...
- 白话OAuth2用户认证及鉴权标准流程
一.OAuth2需求场景 在说明OAuth2需求及使用场景之前,需要先介绍一下OAuth2授权流程中的各种角色: 资源拥有者(User) - 指应用的用户 认证服务器 (Authorization S ...
- 掘金转载-手写一个Promise
目录 一 什么是Promise ? 二 Promises/A+ 规范 2.1 术语 2.2 基本要求 2.2.1. Promise的状态 2.2.2. Then 方法 2.3 简易版实践 2.4 进一 ...
- HDU 2896病毒侵袭
当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~ 但网路上总有那么些网站,开 ...
- Python文件头注释的含义,你肯定不懂
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:冰火梦幻 本文档描述了Python语言文件头里典型注释的含义. 1. ...
- Bayer图像处理 raw 数据解析
Bayer是相机内部的原始图片, 一般后缀名为.raw. 很多软件都可以查看, 比如PS. 我们相机拍照下来存储在存储卡上的.jpeg或其它格式的图片, 都是从.raw格式转化 过来的. .raw格式 ...
- Java_百钱买百鸡
题目:公鸡3文钱,母鸡2文钱,3只小鸡1文钱,百钱买百鸡,求多少公鸡,母鸡,小鸡? public class Work6{ public static void main(String[] args) ...
- Vue-router的实现原理
参考博客:https://www.jianshu.com/p/4295aec31302 参考博客:https://segmentfault.com/a/1190000015123061
- 201871010119-帖佼佼《面向对象程序设计(java)》第十周学习总结
博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...
- Web基础了解版03-jQuery
jQuery jQuery,顾名思义,也就是JavaScript和查询(Query)极大地简化了JavaScript开发人员遍历HTML文档.操作DOM.处理事件.执行动画和开发Ajax. jQuer ...