Csharp/CSharp Tutorial/Attribute/Attributes Reflection
Содержание
Load class method by Attribute
<source lang="csharp">using System; using System.Reflection; [AttributeUsage(AttributeTargets.Class)] public class ClassTarget : Attribute {
public ClassTarget() { }
} [AttributeUsage(AttributeTargets.Method )] public class MethodTarget : Attribute {
public MethodTarget() { }
} public class MyClass {
[MethodTarget] public int MyMethod() { return 5; }
}
class MainClass {
public static void Main(string[] args) { ClassTarget rs; MethodTarget rm; Assembly a = Assembly.LoadFrom("MyClass"); foreach(Type t in a.GetTypes()) { rs = (ClassTarget) Attribute.GetCustomAttribute(t, typeof(ClassTarget)); if(rs != null) { foreach(MethodInfo m in t.GetMethods()) { rm = (MethodTarget) Attribute.GetCustomAttribute(m, typeof(MethodTarget)); if(rm != null) { Object o = Activator.CreateInstance(t); Object[] aa = new Object[0]; int i = (int) m.Invoke(o, aa); } } } }
}
}</source>
Reflecting on Attributes
<source lang="csharp">//Code revised from //A Programmer"s Introduction to C# 2.0, Third Edition using System; using System.Reflection; [AttributeUsage(AttributeTargets.Class, AllowMultiple=true)] public class CodeReviewAttribute: System.Attribute {
public CodeReviewAttribute(string reviewer, string date) { this.reviewer = reviewer; this.date = date; } public string Comment { get { return(comment); } set { comment = value; } } public string Date { get { return(date); } } public string Reviewer { get { return(reviewer); } } string reviewer; string date; string comment;
} [CodeReview("Name1", "01-12-2000", Comment="comment1")] [CodeReview("Name2", "01-01-2012", Comment="comment2")] class Complex { } class MainClass {
public static void Main() { Type type = typeof(Complex); foreach (CodeReviewAttribute att in type.GetCustomAttributes(typeof(CodeReviewAttribute), false)) { Console.WriteLine("Reviewer: {0}", att.Reviewer); Console.WriteLine("Date: {0}", att.Date); Console.WriteLine("Comment: {0}", att.rument); } }
}</source>
Reviewer: Name2 Date: 01-01-2012 Comment: comment2 Reviewer: Name1 Date: 01-12-2000 Comment: comment1
Retrieve Attribute by using reflection
<source lang="csharp">using System; using System.Reflection;
[AttributeUsage(AttributeTargets.All)] public class MyAttribute : Attribute {
public string remark; public MyAttribute(string comment) { remark = comment; } public string Remark { get { return remark; } }
}
[MyAttribute("This class uses an attribute.")] class UseAttrib { }
class MainClass {
public static void Main() { Type t = typeof(UseAttrib); Console.Write("Attributes in " + t.Name + ": "); object[] attribs = t.GetCustomAttributes(false); foreach(object o in attribs) { Console.WriteLine(o); } Console.Write("Remark: "); // Retrieve the MyAttribute. Type tRemAtt = typeof(MyAttribute); MyAttribute ra = (MyAttribute) Attribute.GetCustomAttribute(t, tRemAtt); Console.WriteLine(ra.remark); }
}</source>
Attributes in UseAttrib: MyAttribute Remark: This class uses an attribute.
Use Reflection to get the Attribute
<source lang="csharp">using System; [assembly:System.CLSCompliantAttribute(true)] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] public class MyDescriptionAttribute : System.Attribute {
private string description; public string Desc { get { return description; } set { description = value; } } public MyDescriptionAttribute() {} public MyDescriptionAttribute(string desc) { description = desc;}
}
[MyDescriptionAttribute("Info")] public class MyClass {
public MyClass() { }
}
public class MainClass {
public static int Main(string[] args) { Type t = typeof(MyClass); // Get all attributes in the assembly. object[] customAtts = t.GetCustomAttributes(false); // List all info. Console.WriteLine("Value of MyDescriptionAttribute"); foreach(MyDescriptionAttribute v in customAtts) Console.WriteLine("-> {0}\n", v.Desc); return 0; }
}</source>
Value of MyDescriptionAttribute -> Info
Use the GetCustomAttributes method
<source lang="csharp">using System; public class TrueFalseAttribute : Attribute {
bool bWritten; public bool Written() { return bWritten; } public TrueFalseAttribute(bool Written) { bWritten = Written; }
} public class StringAttribute : Attribute {
string sStage; public string Stage() { return sStage; } public StringAttribute(string Stage) { sStage = Stage; }
} [TrueFalseAttribute(true)] [StringAttribute("Coding")] public class Class1 { } class MainClass {
public static void Main() { Console.WriteLine("Class1 attributes: ");object[] aAttributes = Attribute.GetCustomAttributes(typeof(Class1)); foreach (object attr in aAttributes) { Console.WriteLine(attr); } }
}</source>
Class1 attributes: StringAttribute TrueFalseAttribute