C#反射调用程序集类中方法
建立类
class OperatorClass
{
/// <summary>
/// 加法
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
///
public static int Add(int x, int y)
{
return x + y;
}
/// <summary>
/// 减法
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public static int Subtract(int x, int y)
{ return x - y; }
/// <summary> /// 乘法
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public int Mulitiple(int x, int y)
{ return x * y; }
/// <summary>
/// 除法
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public int Divide(int x, int y)
{
if (y == )
{
Console.WriteLine("除法操作时,除数不能为,返回值暂设定为.");
return ;
} return x / y;
}
/// <summary>
/// 取余数求余
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public int Remain(int x, int y)
{
if (y == )
{
Console.WriteLine("取余操作时,除数不能为,返回值暂设定为.");
return ;
}
return x % y;
}
/// <summary>
/// 获取数组的最大数以及最大数所在的索引
/// </summary>
/// <param name="array">数组</param>
/// <param name="maxIndex">输出最大值的所在的索引</param>
/// <returns></returns>
public int GetMaxNumber(int[] array, out int maxIndex)
{
if (array == null || array.Length == )
{
Console.WriteLine("数组不能为null,数组的长度也不能为,暂定返回值为-1");
maxIndex = -; return -;
}
int max = array[]; maxIndex = ;
for (int i = ; i < array.Length; i++)
{
if (max < array[i])
{
maxIndex = i;
max = array[i];
}
} return max;
}
/// <summary>
/// 获得不定项数组的长度
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
public int GetVaryArrayLength(params int[] array)
{
if (array == null)
{
return ;
}
return array.Length;
}
/// <summary>
/// 测试带ref的参数
/// </summary>
/// <param name="inParameter"></param>
/// <param name="refParameter"></param>
public void TestReference(int inParameter, ref int refParameter)
{
inParameter = ;
refParameter = ;
Console.WriteLine("参数默认为输入参数,如:inParameter,不会改变原来的值.\r\n带ref或者out的参数是引用参数,如:refParameter,可以改变原来的值.");
} public bool TestString(string s1, string s2)
{
string ss = s1 + s2;
return true;
}
/// <summary>
/// 私有方法无法通过反射得到该方法的信息
/// </summary>
private void PrivateMethod()
{
Console.WriteLine("私有方法");
}
}
加载程序集的类,获得其中的方法
Assembly assembly = Assembly.Load("TestClassLibrary");
Console.WriteLine("程序集信息:\n" + assembly.FullName);
Console.WriteLine();
Type[] ts = assembly.GetTypes();//获得程序集中定义的类型
for (int i = ; i < ts.Length; i++)
{
string typeFullName = ts[i].FullName;
Console.WriteLine("类型{0}:[{1}]的所有公共方法:", i + , typeFullName);
MethodInfo[] mis = ts[i].GetMethods();//返回当前类型的所有公共方法
for (int j = ; j < mis.Length; j++)
{
Console.WriteLine("方法名{0}:{1},返回值的类型:{2},是静态方法:{3}",
j + , mis[j].Name, mis[j].ReturnType, mis[j].IsStatic); ParameterInfo[] paras = mis[j].GetParameters();//获取指定的方法或构造函数的参数信息
for (int k = ; k < paras.Length; k++)
{
//当我们知道方法的类型是引用类型时(带有"&"表示引用类型) 如:System.Int32&,此时参数带ref或out修饰
//如果参数是输出参数(paras[k].IsOut==true),则参数的修饰是out,否则是ref
Console.WriteLine(" 参数{0}:{1} {2},签名位置:{3},是输出参数:{4}",
k + , paras[k].ParameterType, paras[k].Name, paras[k].Position, paras[k].IsOut);
}
}
Console.WriteLine();
}
方法的调用
/// <summary>
/// 测试调用类库中的方法
/// </summary>
static void TestInvokeMethod()
{
Type ty = System.Reflection.Assembly.Load("TestClassLibrary").GetType(string.Format("{0}.{1}", "TestClassLibrary", "OperatorClass"));
Console.WriteLine("调用TestClassLibrary.OperatorClass 类的公共静态方法public static int Add(int x, int y) 的例子");
System.Reflection.MethodInfo mi = ty.GetMethod("Add");
//调用静态方法Add时,Invoke的第一个参数为null
object returnValue = mi.Invoke(null, new object[] { , });
Console.WriteLine("Add方法的返回值:{0}\r\n", returnValue);
Console.WriteLine("调用TestClassLibrary.OperatorClass 类的公共方法public int GetMaxNumber(int[] array, out int maxIndex) 的例子");
System.Reflection.MethodInfo mi1 = ty.GetMethod("GetMaxNumber");
//调用实例化方法(非静态方法)需要创建类型的一个实例
object instanceObject = Activator.CreateInstance(ty);
int maxIndex = -;
object[] parametersInfo = new object[] { new int[] { , , , , , }, maxIndex };
//调用实例化方法GetMaxNumber时,Invoke的第一个参数是一个实例化对象
object returnValue1 = mi1.Invoke(instanceObject, parametersInfo);
maxIndex = Convert.ToInt32(parametersInfo[]);
Console.WriteLine("GetMaxNumber方法的返回值(最大值):{0},最大值的索引:{1}", returnValue1, maxIndex); System.Reflection.MethodInfo mi2 = ty.GetMethod("TestString");
object[] str = new object[] { "abc", "" };
object returnvalue2 = mi2.Invoke(instanceObject, str);
}
C#反射调用程序集类中方法的更多相关文章
- C#实现调用Java类中方法
基本思路: 用C#实现调用Java编写的类中的方法:重点是将Java编写的程序打包成Jar,然后使用开源工具IKVM将其转化成DLL控件,在.NET环境下调用. 分为以下步骤: 1.下载JDK6(注: ...
- C#A类派生类强转基类IL居然还是可以调用派生类中方法的例子
大家都知道在C#中,如果B类继承自A类,如果一个对象是B类型的但是转换为A类型之后,这个对象是无法在调用属于B类型的方法的,如下例子: 基类A: public class A { } 派生类B: pu ...
- Android反射出一个类中的其他类对象并调用其对应方法
MainActivity如下: package cn.testreflect; import java.lang.reflect.Field; import java.lang.reflect.Met ...
- 使用反射机制实现jQuery调用ashx类中的指定方法
使用反射机制实现jQuery调用ashx类中的指定方法 近期用asp.net做个小网站,但又不喜欢使用asp.net的服务器端控件,经过一番思量后确定前端采用原始的html.后台采用Linq to ...
- Java反射机制demo(五)—获得并调用一个类中的方法
Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...
- java 通过反射机制调用某个类的方法
package net.xsoftlab.baike; import java.lang.reflect.Method; public class TestReflect { public s ...
- Java中是否可以调用一个类中的main方法?
前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...
- Javacard 解释器怎样在API类库中找到源文件调用的类、方法或者静态域?
申明:本篇非本人原创,是在阅读各种论文文献之后,对论文文献的一种梳理. 主要参考文献为: ------------------------------------------------------- ...
- thymeleaf模板引擎调用java类中的方法(附源码)
前言 <Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦> 由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去解决 ...
随机推荐
- [工具]Mac下非常好用的快捷终端Dterm
[工具]Mac下非常好用的快捷终端Dterm A command line anywhere and everywhere 这是可在任何目录下直接用全局快捷键直接调出命令输入框的小工具,非常好用 作 ...
- 在magento中定义static block
在magento中如何调用static block?(系统面板内CMS---->static block) 解答:若想在站点页面的某个地方放点静态的内容,比如广告,或者是促销信息之类的,这样的东 ...
- iOS动画技术笔记
概述 在IOS开发中,实现动画操作的地方有很多,典型的是在视图控制器的segue操作时.在同一个视图控制器类中,加载切换不同的视图时,也需要动画效果,还有一些视图对象有动画效果会更好. 插一句,在IO ...
- 利用js_API 运行对html文档元素的属性的CRUD操作
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 20141112 WinForm子窗口标签页
(一)标签页 先看看效果: 代码: public partial class 标签页 : Form { string s = ""; public 标签页() { Initiali ...
- utf8+bom格式保存php curl乱码问题
今天开发遇到一个php curl取数据乱码问题 不是gzip也不是编码设置问题 最后有一同事判断为utf8+bom保存数据原因,懒得深入了解utf8+bom,仅做记录 [root@centos5 ~] ...
- Oracle的表连接方式
Oracle的表连接方式: 1.Nl Join连接(嵌套连接) 2.Hash Join(哈希连接) 3.Merge Sort Join(排序合并连接) 各种连接的使用场景: 1. 排序合并连接是偏向于 ...
- JS精粹(二)
这章主要讲语法,DC使用了表示形式语法的巴克斯范式图,这的确比语言来得准确简洁.我只想表达一个问题:表达式与表达式语句的关系.因为其他问题很明白. 从DC的巴科斯范式图上大致可以认为,表达式是比表达式 ...
- MySQL:Error : Tablespace for table '`database`.`temp`' exists. Please DISCARD the tablespace before IMPORT.解决办法
今天在navicat上操作mysql数据库表,突然没有响应了.随后重启,mysql服务也终止了.随后启动服务,检查表,发现一张表卡没了,就重新添加一张表.报了一个错: Error : Tablespa ...
- leetcode 3Sum python
# sort the array# loop from i = 0 # then left=i+1 right=len(nums)-1# try nums[i] - ( nums[left]+nums ...