简单反射样例代码

非专业开发Five 2019-02-23 05:58:55
加精

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Linq;

namespace ConsoleApp1
{
class TestClass
{
public string TestFunc(string z, string b, string c)
{
return $"z is {z};b is {b};c is {c};";
}
}
class Program
{
static void Main(string[] args)
{

var assembly = typeof(test111).Assembly;
var instance = assembly.CreateInstance("ConsoleApp1.TestClass");
var mod = instance.GetType().GetMethod("TestFunc");
List<string> names = mod.GetParameters().Select(f => f.Name).ToList();

List<object> parameters = new List<object>();
foreach (var item in names)
{
parameters.Add(item);
}

Console.WriteLine($"{mod.Invoke(instance, parameters.ToArray())}");
Console.ReadKey();
return;
}
}
}


纯记录向,顺便散一下分。
...全文
7971 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_40710788 2019-06-25
  • 打赏
  • 举报
回复
怎么换的分数呀
A卫星数码 2019-04-11
  • 打赏
  • 举报
回复
谢谢分享, 接分再说
喵大大1 2019-03-07
  • 打赏
  • 举报
回复
不错啊 还可以这么操作
Eng32780 2019-02-27
  • 打赏
  • 举报
回复
学习一下,不错
m0_38050359 2019-02-27
  • 打赏
  • 举报
回复
点赞点赞点赞点赞
  • 打赏
  • 举报
回复
结了结了,技术区不能散分手动结,下次发非技术区。
正怒月神 2019-02-25
  • 打赏
  • 举报
回复
接分 ,走你~
  • 打赏
  • 举报
回复
引用 22 楼 秋的红果实 的回复:
感谢,接分了。新的一年,祝楼主大吉大利!
借你吉言也祝你大吉大利。
  • 打赏
  • 举报
回复
再放一天明天结帖吧,不然我耽误版主上月榜了
引用 4 楼 caozhy 的回复:
既然散分,就多来一点。我帮你加到400,你多散点吧。这个月能不能上榜就看你了。
  • 打赏
  • 举报
回复
引用 3 楼 desperaso 的回复:

 [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Stream stream = new FileStream("net同版本.exe", FileMode.Open);
            byte[] bt = new byte[stream.Length];
            stream.Read(bt, 0, (int)stream.Length);
            stream.Close();

            Assembly asm = Assembly.Load(bt);
            MethodInfo info = asm.EntryPoint;
            ParameterInfo[] parameters = info.GetParameters();
            info.Invoke(null, null);

            Application.Run(new Form1());
        }            
哇!这解决了独占问题,就是费点内存。
desperaso 2019-02-25
  • 打赏
  • 举报
回复
引用 45 楼 by_封爱 的回复:
[quote=引用 3 楼 desperaso 的回复:]
111



Stream stream = new FileStream("net同版本.exe", FileMode.Open);
byte[] bt = new byte[stream.Length];
stream.Read(bt, 0, (int)stream.Length);
stream.Close();



byte[] bt =system.io.file.readallbytes("xxx.exe");

有什么区别?
[/quote]

本来这个代码是从资源文件读取exe文件的base64字符串的,再转byte执行的,临时省事就这么写了。干坏事用的
  • 打赏
  • 举报
回复
引用 50 楼 良朋 的回复:
return $"z is {z};b is {b};c is {c};"; 报错
var assembly = typeof(test111).Assembly; 报错
Console.WriteLine($"{mod.Invoke(instance, parameters.ToArray())}"); 报错


用2017或者改成 tostring+xxx这种。

9012年了还是用vs2017吧
良朋 2019-02-25
  • 打赏
  • 举报
回复
return $"z is {z};b is {b};c is {c};"; 报错
var assembly = typeof(test111).Assembly; 报错
Console.WriteLine($"{mod.Invoke(instance, parameters.ToArray())}"); 报错

良朋 2019-02-25
  • 打赏
  • 举报
回复
这个好, 正在学习反射,你送枕头过来了,谢谢了啊!
  • 打赏
  • 举报
回复
引用 45 楼 by_封爱 的回复:
[quote=引用 3 楼 desperaso 的回复:] 111

            Stream stream = new FileStream("net同版本.exe", FileMode.Open);
            byte[] bt = new byte[stream.Length];
            stream.Read(bt, 0, (int)stream.Length);
            stream.Close();

 byte[] bt =system.io.file.readallbytes("xxx.exe");
有什么区别? [/quote] 你这样看没区别,但是你如果是一个整体的东西涉及多次调用之类的,你可以把你的byt[]存在内存里,不用每次都读文件。
  • 打赏
  • 举报
回复
顺手放几个github上的库解救被动态代理和动态反射困扰的各位。 CoreProxy --动态代理 dynamitey --动态反射 能干什么就看你需要干什么了。
by_封爱 版主 2019-02-25
  • 打赏
  • 举报
回复
引用 3 楼 desperaso 的回复:
111

            Stream stream = new FileStream("net同版本.exe", FileMode.Open);
            byte[] bt = new byte[stream.Length];
            stream.Read(bt, 0, (int)stream.Length);
            stream.Close();

 byte[] bt =system.io.file.readallbytes("xxx.exe");
有什么区别?
北京.NET 2019-02-25
  • 打赏
  • 举报
回复
/// <summary>
/// 全局通用反射示例
/// </summary>
/// <param name="assemblyName">项目名称</param>
/// <param name="className">类名称</param>
/// <param name="methodName">函数名称</param>
/// <param name="parms">参数</param>
/// <returns></returns>
public static Object GetClassMethodReturnResult(string assemblyName, string className, string methodName, Object[] parms)
{
Assembly ass = Assembly.Load(assemblyName);
Type[] types = ass.GetTypes();
object result = null;
foreach (Type item in types)
{
if (item.Name.Equals(className))
{
try
{
if (parms != null && parms.Length > 0)
{

object obj = Activator.CreateInstance(item);
Type[] types1=new Type[parms.Length];
for (int i = 0; i < parms.Length; i++)
{
types1[i] = parms[i].GetType();
}
MethodInfo[] methods = item.GetMethods();
foreach (var mm in methods)
{
if (mm.Name == methodName)
{
if(mm.GetParameters().Length==parms.Length)
result = mm.Invoke(obj, parms);
}
}

}
else
{
object obj = Activator.CreateInstance(item);
MethodInfo m = item.GetMethod(methodName,new Type[]{});
result = m.Invoke(obj, parms);
}
}
catch (Exception e)
{
throw e;
}
}
}
return result;
}


调用示例
object[] o = new object[] {
IdenCard.Text.Trim(),table
};
bool IsExist = (bool)Reflaction.GetClassMethodReturnResult("BizProcess", "AuthorizationRecordBiz", "ExistAuthorizationByIden", o);
lkf181 2019-02-25
  • 打赏
  • 举报
回复
/// <summary>
/// 得到插件中实现接口的实例<T>是某接口
/// </summary>
/// <param name="pDllpath">实现了接口的dll完整路径和文件名</param>
/// <returns></returns>
public static T GetAssemblyLkf<T>(string pDllpath)
{
T MyInstance = default(T);
Assembly asm = null;
try
{
asm = Assembly.LoadFile(pDllpath);
}
catch (BadImageFormatException ex)
{
return MyInstance;
}

Type[] types = asm.GetExportedTypes();
foreach (Type type in types)
{
Type typeInstance = typeof(T);
//判断遍历的类型是否实现了T接口,以前用as 转换为接口,判断是否为空
if (typeInstance.IsAssignableFrom(type) && !type.IsAbstract)
{
MyInstance = (T)Activator.CreateInstance(type);
}
}
return MyInstance;
}
threenewbee 2019-02-24
  • 打赏
  • 举报
回复
既然散分,就多来一点。我帮你加到400,你多散点吧。这个月能不能上榜就看你了。
加载更多回复(6)
java高手真经 全光盘源代码 打包rar 第1部分(2个程序包) HelloWorld.zip 01.Java入门样例HelloWorld demo.zip 03.Eclipse入门样例demo 第2部分(3个程序包) javasyntax.zip 05.Java核心语法详解 javaoop.zip 06.Java面向对象编程(计算器) javaexception.zip 07.Java面向对象编程扩展(计算器异常捕捉实例) 第3部分(5个程序包) javaio.zip 09.Java输入/输出流 javavi.zip 09.Java输入/输出流上机作业参考(文本编辑器) javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip 16.AWT图形界面开发——Java文本编辑器 javamedia.zip 17.AWT多媒体编程——录音机、MP3播放器、视频拍照、视频播放器 javaswing.zip 18.Swing图形界面开发——Java文本编辑器 javaswt.zip 19.SWT图形界面开发——Java文本编辑器 javajface.zip 20.SWT增强组件库JFace 第5部分(5个程序包) javaapplet.zip 21.Applet网络组件——电子相册 javanet.zip 22.Java网络编程详解(Socket/UDP实例、简单聊天系统) javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) javareflection.zip 26.Java反射机制与动态代理 javageneric.zip 27.Java泛型编程 javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性
看到那些要积分的很不酸,发布免费版本。 第1部分(2个程序包) HelloWorld.zip 01.Java入门样例HelloWorld demo.zip 03.Eclipse入门样例demo 第2部分(3个程序包) javasyntax.zip 05.Java核心语法详解 javaoop.zip 06.Java面向对象编程(计算器) javaexception.zip 07.Java面向对象编程扩展(计算器异常捕捉实例) 第3部分(5个程序包) javaio.zip 09.Java输入/输出流 javavi.zip 09.Java输入/输出流上机作业参考(文本编辑器) javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip 16.AWT图形界面开发——Java文本编辑器 javamedia.zip 17.AWT多媒体编程——录音机、MP3播放器、视频拍照、视频播放器 javaswing.zip 18.Swing图形界面开发——Java文本编辑器 javaswt.zip 19.SWT图形界面开发——Java文本编辑器 javajface.zip 20.SWT增强组件库JFace 第5部分(5个程序包) javaapplet.zip 21.Applet网络组件——电子相册 javanet.zip 22.Java网络编程详解(Socket/UDP实例、简单聊天系统) javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) javareflection.zip 26.Java反射机制与动态代理 javageneric.zip 27.Java泛型编程 javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性
不定项选择题(共14题,单选或多选): 一、一个HTML文档必须包含三个元素,它们是head、html和( )。 A.scriptB.bodyC.titleD.link 二、下面哪段javascript能弹出一个提示框?( ) A.document.alert(test) B.window.alert(test) C.document.alert('test ') D.window.alert('test ') 三、当鼠标放在一个链接上的css样式应该( )伪类来定义。 A.a:visitedB.a:linkC.a:hoverD.a:active 四、关于ASP.NET中的代码隐藏文件的描述正确的是( )。 A.Web窗体页的程序的逻辑由代码组成,这些代码的创建用于与窗体交互。该文件称作为“代码隐藏”文件,如果用C#创建,该文件将具有“.ascx.cs”扩展名 B.web窗体也是类 C.项目中所有的Web窗体页的代码隐藏文件都被编译成项目动态链接库(.dll)文件 D.以上都不正确 五、下列ASP.NET语句( )正确地创建了一个与SQL Server数据库的连接。 A.SqlConnection con1 = new Connection(“Data Source = localhost; Trusted_Connection =Yes; Initial Catalog = myDB”); B.SqlConnection con1 = new SqlConnection(“Data Source = localhost; Trusted_Connection =Yes; Initial Catalog = myDB”); C.SqlConnection con1 = new OleDbConnection(“Data Source = localhost; Trusted_Connection =Yes; Initial Catalog = myDB”); D.SqlConnection con1 = new SqlConnection(Data Source = localhost; Trusted_Connection =Yes; Initial Catalog = myDB); 六、执行一次无返回值的数据删除,必须用到下面哪些对象? ( ) A.SqlConnectionB.SqlDataAdapterC.SqlCommandD.SqlDataReader 七、在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是( ) A.insert、update、delete等操作的Sql语句主要用ExecuteNonQuery()方法来执行; B.ExecuteNonQuery()方法返回执行Sql语句所影响的行数。 C.Select操作的Sql语句只能由ExecuteReader()方法来执行; D.ExecuteReader()方法返回一个DataReder对象; 八、ASP.NET有多种维护状态的技术,以下哪种是保存在客户端的?( ) A.VIEWSTATEB.SESSIONC.APPLICATIOND.数据CACHE 九、Cookies的默认生命周期有多长? ( ) A.20分钟B.30分钟C. 一天D.随浏览器的关闭而失效 十、int[][] myArray=new int[3][]{ new int[3]{ 5, 6, 2 }, new int[5]{ 6, 9, 7, 8, 3 }, new int[2]{ 3, 2 }}; myArray[2][2]的值是( ) A.9B.2C.6D.越界 十一、要为做了输出缓存的页面实现即时判断用户IP来路,可在以下哪种事件中实现? ( ) A.Page.InitB.HttpApplication.BeginRequest C.Page.LoadD.以上都不是 十二、下面哪个SQL语句完全正确( ) A.Select count(*) from (select top 10 * from table order by bb) tb group by cc B.update set bb = bb + 1 from table C.Select count(*) from (select distinct * from table) tb group by cc D.delete * from table 十三、为了实现a.aspx的URL重写,下面哪个正则表达式替换可以实现?( ) A. Regex.Replace(sUrl, @“/(\d+).aspx”, “a.aspx?ID=$0”, RegexOptions.IgnoreCase) B. Regex.Replace(sUrl, @“/(\d+).aspx”, “/a.aspx?ID=$0”, RegexOptions.IgnoreCase) C. Regex.Replace(sUrl, @“/(\d+).aspx”, “a.aspx?ID=$1”, RegexOptions.IgnoreCase) D. Regex.Replace(sUrl, @“/(\d+).aspx”, “/a.aspx?ID=$1”, RegexOptions.IgnoreCase) 十四、下面javascript代码的输出结果是( ) var aa = new Array(1, 2, 4, 5, 3, 6); var c = 0; for (var i = 0; i < aa.length; ++i){ c += aa.pop(); } document.write(c); 提示:Array.pop()函数将数组内最后一个元素移除并返回该元素 A.7 B.14 C.21 D.以上皆不正确 填空题(共4题): 一、C#中判断整型变量k是否偶数的语句: 二、有这样的枚举定义:public enum TrainType{ 空调, 快速, 新型, 卧铺 },为实现它的按位组合,你会分别赋予它们什么值?请用逗号按顺序分隔开 三、C#中为了防止非本程序集的代码访问,可以用什么关键字修饰类或者类成员? 四、为了将table表内bb(datetime类型)字段的数据按年月降序输出,对应的SQL语句为 选择题答案: 1.B,2.D,3.C,4.BC,5.B,6.AC,7.C,8.A,9.D,10.D,11.B,12.AC,13.D,14.B 填空题答案: 1.(k & 1) == 0 或 k % 2 == 0 2.1,2,4,8(答案不定,看情况) 3.internal 4.select * from table order by year(bb) desc, month(bb) desc 1.new有几种用法 第一种:new Class(); 第二种:覆盖方法 public new XXXX(){} 第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。 2.如何把一个array复制到arrayList里 foreach( object o in array )arrayList.Add(o); 3.datagrid.datasouse可以连接什么数据源 [dataset,datatable,dataview] dataset,datatable,dataview , IList 4.概述反射和序列化 反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性 序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。 5.概述o/r mapping 的原理 利用反射,配置 将类于数据库表映射 6.类成员有( )种可访问形式 可访问形式?不懂。 可访问性:public ,protected ,private,internal 7.用sealed修饰的类有什么特点 sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。 密封类不能同时为抽象类。 sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。 8.列举ADO.NET中的五个主要对象,并简单描述 connection,command,dataReader,trans,dataset ... 9.执行下面代码后: String strTemp ="abcdefg 某某某"; Int i System.Text.Encoding.Default.GetBytes(strTemp).Length; Int j = strTemp.Length; 问:i=(14 ) ;j=(11 ) i=(14 ) ;j=(11 ) 中文两个字节 10.C#中,string str = null 与 string str ="",请尽量用文字说明区别。(要点:说明详细的内存空间分配) string str ="" 分配空间 11.详述.NET里class和struct的异同! class:放在 ? struct放在? struct值传递 类与结构有很多相似之处:结构可以实现接口,并且可以具有与类相同的成员类型。然而,结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承。结构的值存储在“在堆栈上”或“内联”。细心的程序员有时可以通过聪明地使用结构来增强性能。 12.概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。 远程逻辑调用,remoing接口只能用在.net中 13.什么是code-behind技术 aspx and cs 14.概述三层结构体系 web/business/dataaccess 15.asp.net如何实现MVC模式,举例说明! web/business/dataaccess ---------------------------------------------------------------------------------------------------------- 1.面向对象的思想主要包括什么? 答:这个题范围太广,不知道说什么. 2.什么是ASP.net中的用户控件 答:用户控件就是.ascx扩展名的东西喽,可以拖到不同的页面中调用,以节省代码.比如登陆可能在多个页面上有,就可以做成用户控件,但是有一个问题就是用户控件拖到不同级别的目录下后里面的图片等的相对路径会变得不准确,需要自已写方法调整. 3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释? 答:装箱就是把值类型转成引用类型,从MS IL角度看好像是boxing,没记错的话是把值从堆栈转到堆中.拆箱相反,重载就是指一个方法名同,参数个数不同,返回值可以相同的方法.CLR是通用语言运行时,其它的不清楚. 4.列举一下你所了解的XML技术及其应用 答:XML可是好东西,保存配置,站与站之间的交流,WEB SERVICE都要用它. 5.值类型和引用类型的区别?写出C#的样例代码。 答:结构是值类型,类是引用类型,所以传结构就是值类型的应用啦,传对象或类就是引用类型的,这个不用多写了吧. 6.ADO.net中常用的对象有哪些?分别描述一下。 答:connection command sqladapter dataset datatable dataview等等.写不完了. 7.如何理解委托? 答:据说相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法. msdn2005中是这样解释的: 委托具有以下特点: 委托类似于 C++ 函数指针,但它是类型安全的。 委托允许将方法作为参数进行传递。 委托可用于定义回调方法。 委托可以链接在一起;例如,可以对一个事件调用多个方法。 方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。 C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。 8.C#中的接口和类有什么异同。 答:这个异同可多了,要说清楚还真不容易. 9.。net中读写数据库需要用到哪些类?他们的作用 答:这个类自已可以写的啊,你是指基类吗?那configuration,sqlconnection,sqlcommand等都要用到. 10.UDP连接和TCP连接的异同。 答:前者只管传,不管数据到不到,无须建立连接.后者保证传输的数据准确,须要连结. 11.ASP.net的身份验证方式有哪些?分别是什么原理? 答:form认证,windows集成认证等,原理不清楚. 12.进程和线程分别怎么理解? 答:进程是老子,线程是儿子,没有老子就没有儿子,一个老子可以有多个儿子.一个儿子可以成为别人的儿子,一个老子也可以为别的老子生儿子. 13.什么是code-Behind技术。 答:代码分离,这是个明智的东西,像ASP这样混成一堆很不爽.或者可以理解成HTML代码写在前台,C#代码写在后台.当然前台也有脚本,类的调用等,其实写在一起也是可以的. 14.活动目录的作用。 答:这个不明白.请明白的补充一下. 15..net中读写XML的类都归属于哪些命名空间? 答:System.Xml 我自已写的就不一定了,嘿嘿. 16.解释一下UDDI、WSDL的意义及其作用。 答:什么东西? 17.什么是SOAP,有哪些应用。 答:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息,具体请看:http://playist.blogchina.com/2521621.html 18.如何部署一个ASP.net页面。 答:随便啦,想直接上传就直接上传,想打包成EXE就打包,看个人喜好. 19.如何理解.net中的垃圾回收机制。 答:GC?对象创建了总要清除啊,不然内存哪够用?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧