Csharp/CSharp Tutorial/Attribute/Attribute Definition

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

A custom attribute based on bool value

<source lang="csharp">using System; public class TrueFalseAttribute : Attribute {

 bool bWritten;
 public bool Written()
 {
   return bWritten;
 }
 public TrueFalseAttribute(bool Written)
 {
   bWritten = Written;
 }

} [TrueFalseAttribute(true)] public class Class1 { } [TrueFalseAttribute(false)] public class Class2 { } class MainClass {

 public static void Main() 
 {
   TrueFalseAttribute u;
   Console.Write("Class1 TrueFalseAttribute attribute: ");
   u = (TrueFalseAttribute) Attribute.GetCustomAttribute(typeof(Class1), typeof(TrueFalseAttribute));
   Console.WriteLine(u.Written());
   Console.Write("Class2 TrueFalseAttribute attribute: ");
   u = (TrueFalseAttribute) Attribute.GetCustomAttribute(typeof(Class2), typeof(TrueFalseAttribute));
   Console.WriteLine(u.Written());
 }

}</source>

Class1 TrueFalseAttribute attribute: True
Class2 TrueFalseAttribute attribute: False

Assembly level attributes don"t have to be in the assemblyinfo.cs file, but must be lised outside of any namespae definition.

<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

Attribute with supplement information

<source lang="csharp">using System; [AttributeUsage(AttributeTargets.All)] public class MyAttribute : Attribute {

 string remark;

 public string supplement;

 public MyAttribute(string comment) { 
   remark = comment; 
   supplement = "None"; 
 } 

}</source>

Create Attribute

<source lang="csharp">using System; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)] public class AuthorAttribute : System.Attribute {

   public string Company; 
   public string Name;    
   public AuthorAttribute(string name)
   {
       this.Name = name;
       Company = "";
   }

}

[Author("Name1")] [Author("Name2", Company = "Ltd.")] class MainClass {

   public static void Main()
   {
       Type type = typeof(MainClass);
       object[] attrs = type.GetCustomAttributes(typeof(AuthorAttribute), true);
       foreach (AuthorAttribute a in attrs)
       {
           Console.WriteLine(a.Name + ", " + a.rupany);
       }
   }

}</source>

Name2, Ltd.
Name1,

Positional vs. Named Parameters

  1. A positional parameter is linked by its position.
  2. Positional parameters must be specified in the order in which they appear.
  3. Named parameters are specified by assigning values to their names.
  4. For an attribute, you can also create named parameters
  5. named parameters can be assigned initial values by using their names.
  6. A named parameter is supported by either a public field or property, which must not be read-only.

Here is the general form of an attribute specification that includes named parameters:


<source lang="csharp">[attrib(positional-param-list, named-param1 = value, named-param2 = value, ...)]</source>

Use a named attribute parameter.

<source lang="csharp">using System; using System.Reflection;

[AttributeUsage(AttributeTargets.All)] public class MyAttribute : Attribute {

 public string remark;

 public string supplement; 

 public MyAttribute(string comment) { 
   remark = comment; 
   supplement = "None"; 
 } 

 public string Remark { 
   get { 
     return remark; 
   } 
 } 

}

[MyAttribute("This class uses an attribute.",

                supplement = "This is additional info.")] 

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); 
   } 

   // Retrieve the MyAttribute. 
   Type tRemAtt = typeof(MyAttribute); 
   MyAttribute ra = (MyAttribute) 
         Attribute.GetCustomAttribute(t, tRemAtt); 

   Console.Write("Remark: "); 
   Console.WriteLine(ra.remark); 

   Console.Write("Supplement: "); 
   Console.WriteLine(ra.supplement); 
 }  

}</source>

Attributes in UseAttrib: MyAttribute
Remark: This class uses an attribute.
Supplement: This is additional info.

Use a property as a named attribute parameter.

<source lang="csharp">using System; using System.Reflection;

[AttributeUsage(AttributeTargets.All)] public class MyAttribute : Attribute {

 public string remark;

 public int priority; 

 public string supplement; 

 public MyAttribute(string comment) { 
   remark = comment; 
   supplement = "None"; 
 } 

 public string Remark { 
   get { 
     return remark; 
   } 
 } 

 public int Priority { 
   get { 
     return priority; 
   } 
   set { 
     priority = value; 
   } 
 } 

}

[MyAttribute("This class uses an attribute.",

                supplement = "This is additional info.", 
                Priority = 10)] 

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); 
   } 

   // Retrieve the MyAttribute. 
   Type tRemAtt = typeof(MyAttribute); 
   MyAttribute ra = (MyAttribute) 
         Attribute.GetCustomAttribute(t, tRemAtt); 

   Console.Write("Remark: "); 
   Console.WriteLine(ra.remark); 

   Console.Write("Supplement: "); 
   Console.WriteLine(ra.supplement); 

   Console.WriteLine("Priority: " + ra.priority); 
 }  

}</source>

Attributes in UseAttrib: MyAttribute
Remark: This class uses an attribute.
Supplement: This is additional info.
Priority: 10