项目1
using System; using System.Collections.Generic; using System.Text; namespace SupportsWhatsNew { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] public class LastModifiedAttribute : Attribute { private DateTime dateModified; private string changes; private string issues; public LastModifiedAttribute(string dateModified, string changes) { this.dateModified = DateTime.Parse(dateModified); this.changes = changes; } public DateTime DateModified { get { return dateModified; } } public string Changes { get { return changes; } } public string Issues { get { return issues; } set { issues = value; } } } [AttributeUsage(AttributeTargets.Assembly)] public class SupportsWhatsNewAttribute : Attribute { } }
项目2
using System; using System.Collections.Generic; using System.Text; using SupportsWhatsNew; [assembly: SupportsWhatsNew] namespace VectorClass { [LastModified("14 Feb 2007", "IEnumerable interface implemented" + "So Vector can now be treated as a collection" )] [LastModified("10 Feb 2007", "IFormattable interface implemented" + "So Vector now responds to format specifiers N and VE" )] class Vector { public double x, y, z; public Vector(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } [LastModified("14 Feb 2007", "Class created as part of collection support for Vector")] public string tostring(string format) { //if (format == null) return ToString(); } } }
项目3
using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Windows.Forms; using SupportsWhatsNew; using VectorClass; namespace chapter12 { class WhatsNewChecker { static StringBuilder outputText = new StringBuilder(1000); static DateTime backDateTo = new DateTime(2007, 2, 1); static void AddToMessage(string message) { outputText.Append("/n" + message); } static void WriteAttributeInfo(Attribute attrib) { LastModifiedAttribute lastModifiedAttrb = attrib as LastModifiedAttribute; if (lastModifiedAttrb == null) { return; } DateTime modifiedDate = lastModifiedAttrb.DateModified; if (modifiedDate < backDateTo) { return; } AddToMessage(" MODIFIED: " + modifiedDate.ToLongDateString() + ":"); AddToMessage(" " + lastModifiedAttrb.Changes); if (lastModifiedAttrb.Issues != null) { AddToMessage(" Outstanding issues:" + lastModifiedAttrb.Issues); } } static void DisplayTypeInfo(Assembly theAssembly, Type type) { if (!(type.IsClass))//只显示类 { return; } AddToMessage("/nclass" + type.Name); Attribute[] attribs = Attribute.GetCustomAttributes(type);//的到类上的自定义类attribute if (attribs.Length == 0) { AddToMessage("No changes to this class/n"); } else { foreach (Attribute attrib in attribs) { WriteAttributeInfo(attrib); } MethodInfo[] methods = type.GetMethods();//的道类中的所有方法描述集合 AddToMessage("CHANGES TO METHODS OF THIS CLASS:"); foreach (MethodInfo nextMethod in methods) { object[] attribs2 = nextMethod.GetCustomAttributes(typeof(LastModifiedAttribute), false);//得到定义在方法上的attribute类 if (attribs != null) { AddToMessage(nextMethod.ReturnType + " " + nextMethod.Name + "()"); foreach (Attribute nextAttrib in attribs2) { WriteAttributeInfo(nextAttrib); } } } } } static void Main() { Assembly theAssembly = Assembly.Load("VectorClass"); Attribute supportsAttribute = Attribute.GetCustomAttribute(theAssembly, typeof(SupportsWhatsNewAttribute)); string Name = theAssembly.FullName; AddToMessage("Assembly: " + Name); if (supportsAttribute == null) { AddToMessage("This assembly does not support WhatsNew attributes"); return; } else { AddToMessage("Defined Types:"); } Type[] types = theAssembly.GetTypes(); foreach (Type definedType in types) DisplayTypeInfo(theAssembly, definedType); MessageBox.Show(outputText.ToString(), "what/'s New since " + backDateTo.ToLongDateString()); Console.ReadLine(); } } }
一个展示反射应用的备忘程序。
反射应用实例
本文通过一个具体案例展示了如何使用.NET框架中的反射技术来获取并显示类及其成员上的自定义属性信息,特别是用于记录类及方法变更历史的自定义属性。
252

被折叠的 条评论
为什么被折叠?



