// Demonstrate the Conditional attribute.
#define TRIAL
using System;
using System.Diagnostics;
public class TestAno {
[Conditional("TRIAL")]
void trial() {
Console.WriteLine("Trial version, not for distribution.");
}
[Conditional("RELEASE")]
void release() {
Console.WriteLine("Final release version.");
}
public static void Main() {
TestAno t = new TestAno();
t.trial(); // call only if TRIAL is defined
t.release(); // called only if RELEASE is defined
}
}
Language Basics
Use a property as a named attribute parameter
/*
C#: The Complete Reference
by Herbert Schildt
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/
// Use a property as a named attribute parameter.
using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.All)]
class RemarkAttribute : Attribute {
string remarkValue; // underlies remark property
int pri_priority; // underlies priority property
public string supplement; // this is a named parameter
public RemarkAttribute(string comment) {
remarkValue = comment;
supplement = "None";
}
public string remark {
get {
return remarkValue;
}
}
// Use a property as a named parameter.
public int priority {
get {
return pri_priority;
}
set {
pri_priority = value;
}
}
}
[RemarkAttribute("This class uses an attribute.",
supplement = "This is additional info.",
priority = 10)]
class UseAttrib {
// ...
}
public class NamedParamDemo11 {
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);
}
// Retrieve the RemarkAttribute.
Type tRemAtt = typeof(RemarkAttribute);
RemarkAttribute ra = (RemarkAttribute)
Attribute.GetCustomAttribute(t, tRemAtt);
Console.Write("Remark: ");
Console.WriteLine(ra.remark);
Console.Write("Supplement: ");
Console.WriteLine(ra.supplement);
Console.WriteLine("Priority: " + ra.priority);
}
}
Use AttributeUsage
using System;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct,Inherited = false)]
public class ClassVersionAttribute : System.Attribute {
public ClassVersionAttribute(string target) : this(target, target) {
}
public ClassVersionAttribute(string target,string current) {
m_TargetVersion = target;
m_CurrentVersion = current;
}
private bool m_UseCurrentVersion = false;
public bool UseCurrentVersion {
set {
if (m_TargetVersion != m_CurrentVersion) {
m_UseCurrentVersion = value;
}
}
get {
return m_UseCurrentVersion;
}
}
private string m_CurrentName;
public string CurrentName {
set {
m_CurrentName = value;
}
get {
return m_CurrentName;
}
}
private string m_TargetVersion;
public string TargetVersion {
get {
return m_TargetVersion;
}
}
private string m_CurrentVersion;
public string CurrentVersion {
get {
return m_CurrentVersion;
}
}
}
Defining New Attribute Classes
using System;
using System.Diagnostics;
using System.Reflection;
[AttributeUsage(AttributeTargets.Class)]
public class ClassAuthorAttribute : Attribute
{
private string AuthorName;
public ClassAuthorAttribute(string AuthorName)
{
this.AuthorName = AuthorName;
}
public string Author
{
get
{
return AuthorName;
}
}
}
[ClassAuthor("AA")]
public class TestClass
{
public void Method1()
{
Console.WriteLine("Hello from Method1!");
}
[Conditional("DEBUG")]
public void Method2()
{
Console.WriteLine("Hello from Method2!");
}
public void Method3()
{
Console.WriteLine("Hello from Method3!");
}
}
public class MainClass
{
public static void Main()
{
TestClass MyTestClass = new TestClass();
MyTestClass.Method1();
MyTestClass.Method2();
MyTestClass.Method3();
object [] ClassAttributes;
MemberInfo TypeInformation;
TypeInformation = typeof(TestClass);
ClassAttributes = TypeInformation.GetCustomAttributes(typeof(ClassAuthorAttribute), false);
if(ClassAttributes.GetLength(0) != 0)
{
ClassAuthorAttribute ClassAttribute;
ClassAttribute = (ClassAuthorAttribute)(ClassAttributes[0]);
Console.WriteLine("Class Author: {0}", ClassAttribute.Author);
}
}
}
Attribute in class inheritance
using System;
using System.Security;
using System.Security.Permissions;
using System.Security.Principal;
using System.Threading;
public class Starter {
public static void Main() {
GenericIdentity g = new GenericIdentity("Person1");
GenericPrincipal p = new GenericPrincipal(g,new string[] { "Manager" });
Thread.CurrentPrincipal = p;
MyClass.MethodA();
YClass.MethodA();
}
}
[PrincipalPermission(SecurityAction.Demand, Role = "Manager")]
public class MyClass {
static public void MethodA() {
Console.WriteLine("MyClass.MethodA");
}
}
[PrincipalPermission(SecurityAction.Demand,Role = "Accountant")]
public class YClass : MyClass {
static public void MethodB() {
Console.WriteLine("MyClass.MethodB");
}
}
Creating and using a class attribute.
using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class Creator : System.Attribute {
public Creator(string name, string date) {
this.name = name;
this.date = date;
version = 0.1;
}
string date;
string name;
public double version;
}
[Creator(“T”, “05/01/2001”, version = 1.1)]
class MainClass {
static public void Main(String[] args) {
for (int i = 0; i < args.Length; ++i)
System.Console.WriteLine("Args[{0}] = {1}", i, args[i]);
}
}
[/csharp]
Use a named attribute parameter
// Use a named attribute parameter.
using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.All)]
class RemarkAttribute : Attribute {
string remarkValue; // underlies remark property
public string supplement; // this is a named parameter
public RemarkAttribute(string comment) {
remarkValue = comment;
supplement = "None";
}
public string remark {
get {
return remarkValue;
}
}
}
[RemarkAttribute("This class uses an attribute.",
supplement = "This is additional info.")]
class UseAttrib {
// ...
}
public class NamedParamDemo {
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);
}
// Retrieve the RemarkAttribute.
Type tRemAtt = typeof(RemarkAttribute);
RemarkAttribute ra = (RemarkAttribute)
Attribute.GetCustomAttribute(t, tRemAtt);
Console.Write("Remark: ");
Console.WriteLine(ra.remark);
Console.Write("Supplement: ");
Console.WriteLine(ra.supplement);
}
}