反射对象用于在运行时获取类型信息,允许访问正在运行的程序的元数据的类位于System.Reflection命名空间中。
System.Reflection命名空间包含允许您获取有关应用程序的信息并动态向应用程序添加类型、值和对象的类。
查看元数据
需要初始化System.Reflection类的MemberInfo对象以发现与类关联的属性。为此,将目标类的对象定义为-
System.Reflection.MemberInfo info = typeof(MyClass);
以下程序演示了此-
using System;
[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : System.Attribute {
public readonly string Url;
public string Topic //Topic is a named parameter {
get {
return topic;
}
set {
topic = value;
}
}
public HelpAttribute(string url) //url is a positional parameter {
this.Url = url;
}
private string topic;
}
[HelpAttribute("Information on the class MyClass")]
class MyClass {
}
namespace AttributeAppl {
class Program {
static void Main(string[] args) {
System.Reflection.MemberInfo info = typeof(MyClass);
object[] attributes = info.GetCustomAttributes(true);
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> attributes</span><span class="pun">.</span><span class="typ">Length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">attributes</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadKey</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
}
编译并运行时,它显示附加到类MyClass-的自定义属性的名称
HelpAttribute
在本例中,无涯教程使用上一章中创建的DeBugInfo属性,并使用反射读取Rectangle类中的元数据。
using System;
using System.Reflection;
namespace BugFixApplication {
//要分配给类及其成员的自定义属性 BugFix
[AttributeUsage(
AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
public class DeBugInfo : System.Attribute {
private int bugNo;
private string developer;
private string lastReview;
public string message;
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">DeBugInfo</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> bg</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> dev</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> d</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">bugNo </span><span class="pun">=</span><span class="pln"> bg</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">developer </span><span class="pun">=</span><span class="pln"> dev</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">lastReview </span><span class="pun">=</span><span class="pln"> d</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">BugNo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">get</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> bugNo</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> </span><span class="typ">Developer</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">get</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> developer</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> </span><span class="typ">LastReview</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">get</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> lastReview</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> </span><span class="typ">Message</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">get</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> message</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">set</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
message </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">value</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
[DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "Return type mismatch")]
[DeBugInfo(49, "Nuha Ali", "10/10/2012", Message = "Unused variable")]
class Rectangle {
//member variables
protected double length;
protected double width;
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Rectangle</span><span class="pun">(</span><span class="kwd">double</span><span class="pln"> l</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> w</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
length </span><span class="pun">=</span><span class="pln"> l</span><span class="pun">;</span><span class="pln">
width </span><span class="pun">=</span><span class="pln"> w</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">[</span><span class="typ">DeBugInfo</span><span class="pun">(</span><span class="lit">55</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Zara Ali"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"19/10/2012"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Message</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Return type mismatch"</span><span class="pun">)]</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">GetArea</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> length </span><span class="pun">*</span><span class="pln"> width</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">[</span><span class="typ">DeBugInfo</span><span class="pun">(</span><span class="lit">56</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Zara Ali"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"19/10/2012"</span><span class="pun">)]</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Display</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Length: {0}"</span><span class="pun">,</span><span class="pln"> length</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Width: {0}"</span><span class="pun">,</span><span class="pln"> width</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Area: {0}"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">GetArea</span><span class="pun">());</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}//end class Rectangle
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle(4.5, 7.5);
r.Display();
Type type = typeof(Rectangle);
</span><span class="com">//iterating through the attribtues of the Rectangle class</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Object</span><span class="pln"> attributes </span><span class="kwd">in</span><span class="pln"> type</span><span class="pun">.</span><span class="typ">GetCustomAttributes</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">DeBugInfo</span><span class="pln"> dbi </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">DeBugInfo</span><span class="pun">)</span><span class="pln">attributes</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">null</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> dbi</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Bug no: {0}"</span><span class="pun">,</span><span class="pln"> dbi</span><span class="pun">.</span><span class="typ">BugNo</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Developer: {0}"</span><span class="pun">,</span><span class="pln"> dbi</span><span class="pun">.</span><span class="typ">Developer</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Last Reviewed: {0}"</span><span class="pun">,</span><span class="pln"> dbi</span><span class="pun">.</span><span class="typ">LastReview</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Remarks: {0}"</span><span class="pun">,</span><span class="pln"> dbi</span><span class="pun">.</span><span class="typ">Message</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">//iterating through the method attribtues</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="typ">MethodInfo</span><span class="pln"> m </span><span class="kwd">in</span><span class="pln"> type</span><span class="pun">.</span><span class="typ">GetMethods</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Attribute</span><span class="pln"> a </span><span class="kwd">in</span><span class="pln"> m</span><span class="pun">.</span><span class="typ">GetCustomAttributes</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">DeBugInfo</span><span class="pln"> dbi </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">DeBugInfo</span><span class="pun">)</span><span class="pln">a</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">null</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> dbi</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Bug no: {0}, for Method: {1}"</span><span class="pun">,</span><span class="pln"> dbi</span><span class="pun">.</span><span class="typ">BugNo</span><span class="pun">,</span><span class="pln"> m</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Developer: {0}"</span><span class="pun">,</span><span class="pln"> dbi</span><span class="pun">.</span><span class="typ">Developer</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Last Reviewed: {0}"</span><span class="pun">,</span><span class="pln"> dbi</span><span class="pun">.</span><span class="typ">LastReview</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Remarks: {0}"</span><span class="pun">,</span><span class="pln"> dbi</span><span class="pun">.</span><span class="typ">Message</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
}
编译并执行上述代码时,将生成以下输出-
Length: 4.5 Width: 7.5 Area: 33.75 Bug No: 49 Developer: Nuha Ali Last Reviewed: 10/10/2012 Remarks: Unused variable Bug No: 45 Developer: Zara Ali Last Reviewed: 12/8/2012 Remarks: Return type mismatch Bug No: 55, for Method: GetArea Developer: Zara Ali Last Reviewed: 19/10/2012 Remarks: Return type mismatch Bug No: 56, for Method: Display Developer: Zara Ali Last Reviewed: 19/10/2012 Remarks: