﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-紫蝶∏飛揚↗-文章分类-C#</title><link>http://www.blogjava.net/algz/category/53929.html</link><description>Purple Butterfly Flying
QQ群:7101519
Flex,Ext,Spring,Hibernate,EOS,SpringSecurity,Struts
http://algz.googlecode.com/svn/trunk/</description><language>zh-cn</language><lastBuildDate>Wed, 25 Sep 2013 07:57:15 GMT</lastBuildDate><pubDate>Wed, 25 Sep 2013 07:57:15 GMT</pubDate><ttl>60</ttl><item><title>反射生成笔记</title><link>http://www.blogjava.net/algz/articles/404420.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 25 Sep 2013 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/404420.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/404420.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/404420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/404420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/404420.html</trackback:ping><description><![CDATA[<div> <div><span style="font-size: 9pt; font-family: 'NSimSun'"> <div><span style="font-size: 9pt; color: #2b91af;"><span style="color: #008000">//*********创建实例***********</span></span></div> <div><span style="font-size: 9pt; color: #2b91af;">Type<span style="color: windowtext">&nbsp;t&nbsp;=&nbsp;<span style="color: #0000ff">typeof</span>(</span>ClassTest<span style="color: windowtext">);<span style="color: #008000">//表示类型声明：类类型、接口类型、数组类型、值类型、枚举类型、类型参数...。</span></span></span></div> <div><span style="font-size: 9pt; color: windowtext;"><span style="color: #0000ff">object</span>&nbsp;obj&nbsp;=&nbsp;<span style="color: #2b91af">Activator</span>.CreateInstance(t);<span style="color: #008000">//通过反射创建对象实例,如果是静态类则不须实例化</span></span></div> <div><span style="font-size: 9pt; color: windowtext;"><span style="color: #008000"> <div><span style="font-size: 9pt;">//obj&nbsp;=&nbsp;ass.CreateInstance("ReflectionTest.ClassTest");&nbsp;//类的全限定名.命名空间.类名</span></div></span></span></div> <div><span style="font-size: 9pt; color: windowtext;"><span style="color: #2b91af"><span style="font-size: 9pt;"><span style="color: #008000">//*********创建和调用方法***********</span></span></span></span></div> <div><span style="font-size: 9pt; color: windowtext;"><span style="color: #2b91af">MethodInfo</span>&nbsp;method&nbsp;=&nbsp;t.GetMethod(<span style="color: #a31515">"WriteString"</span>);&nbsp;<span style="color: #008000">//搜索具有指定名称的公共方法。</span></span></div> <div><span style="font-size: 9pt; color: windowtext;"><span style="color: #2b91af">String</span>&nbsp;s&nbsp;=&nbsp;(<span style="color: #2b91af">String</span>)method.Invoke(obj,&nbsp;<span style="color: #0000ff">new</span>&nbsp;<span style="color: #2b91af">Object</span>[]&nbsp;{&nbsp;<span style="color: #a31515">"123"</span>&nbsp;});<span style="color: #008000">//反射类的对象实例,方法参数&nbsp;</span></span></div> <div><span style="font-size: 9pt; color: windowtext;"><span style="color: #008000">//静态方法</span></span><span style="font-size: 9pt; color: windowtext;"><span style="color: #008000"><span style="font-size: 9pt; color: windowtext;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></div> <div> <div> <div> <div><span style="font-size: 9pt;">method&nbsp;=&nbsp;type.GetMethod(<span style="color: #a31515">"StaticWriteString"<span style="color: windowtext">);</span></span></span></div> <div><span style="font-size: 9pt; color: windowtext;">method.Invoke(<span style="color: #0000ff">null</span>,&nbsp;<span style="color: #0000ff">new</span>&nbsp;<span style="color: #0000ff">string</span>[]&nbsp;{&nbsp;<span style="color: #a31515">"test"</span>&nbsp;});&nbsp;<span style="color: #008000">//如果是静态方法,第1个参数则忽略,设为null&nbsp;&nbsp;</span></span></div> <div><span style="font-size: 9pt; color: windowtext;"></span>&nbsp;</div> <div><span style="font-size: 9pt; color: windowtext;"><span style="color: #008000">//无参的静态方法</span></span></div> <div><span style="font-size: 9pt; color: windowtext;"><span style="color: #008000"> <div><span style="font-size: 9pt; color: windowtext;"> <div><span style="font-size: 9pt;">method&nbsp;=&nbsp;type.GetMethod(<span style="color: #a31515">"NoneParaWriteString"<span style="color: windowtext">);&nbsp;&nbsp;</span></span></span></div> <div><span style="font-size: 9pt; color: windowtext;">method.Invoke(<span style="color: #0000ff">null</span>,&nbsp;<span style="color: #0000ff">null</span>);<span style="color: #008000">//无参则第2个参数设为null.</span></span></div> <div>&nbsp;</div></span></div></span></span></div></div></div></div> <div><span style="font-size: 9pt; color: windowtext;">System.Diagnostics.<span style="color: #2b91af">Trace</span>.WriteLine(s);//输出到"调试--窗口--即时窗口"</span></div></span></div> <div>&nbsp;</div> <div><span style="font-size: 9pt; font-family: 'NSimSun'">C#反射学习时几点注意内容：</span></div> <div></div> <div><span style="font-size: 9pt; font-family: 'NSimSun'">1．指定类库文件必须使用绝对路径，不能使用相对路径（其实感觉有点不合理，不太方便）</span></div> <div></div> <div><span style="font-size: 9pt; font-family: 'NSimSun'">3．第5行如果反射的类使用的是静态方法,则第1个参数须调为null</span><span style="font-size: 9pt; font-family: 'NSimSun'">。</span></div> <div></div> <div><span style="font-size: 9pt; font-family: 'NSimSun'">4．由于这个方法有两个参数，可以用这种Object的方法指定参数也可以直接写method.Invoke(obj,&nbsp;<span style="color: #0000ff">new<span style="color: windowtext">&nbsp;Object[]&nbsp;{&nbsp;<span style="color: #a31515">"test"</span>,&nbsp;1&nbsp;});</span></span></span></div> <div></div> <div><span style="font-size: 9pt; font-family: 'NSimSun'; color: windowtext">5．调用的方法是一个静态方法，这时候Invoke的时候，对于第一个参数是无视的，也就是我们写什么都不会被调用，即使我们随便new了一个any这样的Object，当然这种写法是不推荐的。但是对应在例子1种我们如果Invoke的时候用了类型不一致的实例来做为参数的话，将会导致一个运行时的错误。</span></div> <div></div> <div><span style="font-size: 9pt; font-family: 'NSimSun'; color: windowtext">6．第三个例子是一个调用无参数静态方法的例子，这时候两个参数我们都不需要指定，用null就可以了。</span></div></div> <div> <div></div> <div><span style="font-size: 9pt; font-family: 'NSimSun'">再说一个问题，如果调用的类是静态类的时候，需要注意一个问题，肯定我们会想到一个问题，静态类是不能实例化的，这时候，31行的类的实例化的方法我们就不需要了，直接使用Invoke就可以实现，否则将会出现运行时的错误，同样的道理，第一个参数将会被无视，只要我们传对了参数就可以了。</span></div></div><img src ="http://www.blogjava.net/algz/aggbug/404420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2013-09-25 15:40 <a href="http://www.blogjava.net/algz/articles/404420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>