カスタム属性とは何かを説明する一方で、属性について理解する必要があります。属性は、実行時に C# プログラム内の要素に関する追加情報を C# コンパイラに提供するメタデータ拡張です。これらの属性は、条件を設定したり、コードの読みやすさと効率を向上させるために使用されます。 C# (C シャープ) には非常に多くの定義済み属性が存在し、「カスタム属性」と呼ばれる新しいユーザー属性を作成する機能もあります。カスタム クラスを作成するには、システムからクラスを構築する必要があります。属性クラス。
C# カスタム属性は、構築に使用される事前定義されたクラスに基づいて機能します。カスタム属性を作成する方法を段階的に見ていきます。カスタム属性を作成する手順:
AttributeUsageAttribute タグを使用する場合: 属性の構築に AttributeUsageAttribute タグが使用されます。このタグは、ターゲット属性が何か、これを継承できるかどうか、または属性の複数のオブジェクトまたはインスタンスが存在できるかどうかにも使用されます。この AttributeUsageAttribute タグには 3 つの主要メンバーがあります
1. AttributeUsageAttribute(AttributeTargets.All): AttributeTargets.All は、属性をプログラムの他のすべての部分に適用できることを指定しますが、Attribute.クラスは、クラスに適用する必要があることを示し、AttributeTargets.Method パラメーターをカスタム メソッドに適用する必要があります。
構文:
AttributeUsageAttribute( AttributeTargets.All)
2. AttributeUsage(AttributeTargets.All, Inherited = false): このことから AttributeUsageAttribute(AttributeTargets.All) は継承されたメンバーであり、カスタム属性が継承されるかどうかを示します。 Inherited = false は、true/false のブール値です。 Inherited = true/false を指定しなかった場合、デフォルト値は true です。
構文:
AttributeUsage(AttributeTargets.All, Inherited = false)
3. AttributeUsage(AttributeTargets.Method,AllowMultiple = true): このAllowMultipleパラメータから、属性のオブジェクトが複数存在するかどうかがわかります。ブール値も同様に受け取ります。デフォルトでは、このブール値は false です。
構文:
AttributeUsage(AttributeTargets.Method, AllowMultiple = true)
1.属性クラスを定義することによって: これは通常のクラス定義とほぼ同じです。クラス名は従来の Attribute で終わります。この属性クラスは System.から継承されます。属性クラス。
構文:
[AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = false)] public class MyAttributeDefinition: Attribute { //some logic or methods }
1.プロパティとコンストラクターの定義: デフォルト値を設定するための他のすべてのクラス コンストラクターと同様のコンストラクターの定義とプロパティは、データベース接続名情報、静的情報などの定義に使用されます。
構文 #1
public MyAttribute(dataType dataTypeValue) { this.dataTypeValue= dataTypeValue; }
構文 #2
public dataType Properties { get {return this.dataTypeValue;} set {this.value = presentValue;} }
以下に挙げる例を示します:
typeOf 演算子を使用したカスタム属性
コード:
// including packages using System; using System.Reflection; using System.Collections.Generic; // Creating a custom class from Attribute class class CustomAttribute : Attribute { // private variables declaration private string name; private string company; //parameterized class CustomAttribute constuctor public CustomAttribute(string name, string company) { this.name = name; this.company = company; } // method to display the fields by using reflection class public static void AttributeDisplay(Type classType) { Console.WriteLine("All the Methods of the class {0} are", classType.Name); //methods of the class for store all the attribute values MethodInfo[] methods = classType.GetMethods(); //looping through method attribute values by using for loop for (int i = 0; i < methods.GetLength(0); i++) { //create the array to recieve all the custom attribute values object[] attributesArray = methods[i].GetCustomAttributes(true); // foreach loop to read the values through all attributes of the method foreach(Attribute item in attributesArray) { if (item is CustomAttribute) { //display the custom attribute values CustomAttribute attributeObject = (CustomAttribute)item; Console.WriteLine("{0} - {1}, {2} ", methods[i].Name, attributeObject.name, attributeObject.company); } } } } } //Employer class to create employer fields class Employer { //employer fields declaration int employeeID; string name; //Parameterized Employer class constructor public Employer(int eID, string name) { this.employeeID = eID; this.name = name; } // Applying the custom attribute for CustomAttribute for the getId method [CustomAttribute("Accessor Values", "Generates employee ID")] public int getEmployeeID() { return employeeID; } // Applying the custom attribute to CustomAttribute for the getName method [CustomAttribute("Accessor Values", "Generates employee ID")] public string getName() { return name; } } //create employee class class Employee { //Declaring variables of Employee int employeeID; string name; //Parameterized Employee constructor public Employee(int eID, string name) { this.employeeID = eID; this.name = name; } // Applying the custom attribute CustomAttribute for the getEmployeeID method [CustomAttribute("Accessor Values", "Generates employee ID")] public int getEmployeeID() { return employeeID; } // Applying the custom attribute CustomAttribute for the getName method [CustomAttribute("Accessor Values", "Generates employee ID")] public string getName() { return name; } } //create a class for display the output public class Program { // main method for the application public static void Main(string[] args) { //calling static method for display typeOf employer class CustomAttribute.AttributeDisplay(typeof(Employer)); Console.WriteLine(); //calling static method for display typeOf employee class CustomAttribute.AttributeDisplay(typeof(Employee)); } }
出力:
従業員の詳細を含むカスタム属性
コード:
using System; [AttributeUsage(AttributeTargets.All)] class CustomAttribute : Attribute { private string name; private string designation; // Constructor public CustomAttribute(string name, string designation) { this.name = name; this.designation = designation; } // setters and getters public string Name { get { return name; } } // property to get designation public string Action { get { return designation; } } } class Employee { private int empID; private string empName; private double salary; [CustomAttribute("Modifier", "Assigns the Employee Details")] public void setDetails(int id,string name, double sal) { empID = id; empName = name; salary=sal; } [CustomAttribute("It is an Accessor", "Displays empID")] public int getEmpID() { return empID; } [CustomAttribute("It is an Accessor", "Displays empID")] public string getEmpName() { return empName; } [CustomAttribute("It is an Accessor", "Displays empID")] public double getSalary() { return salary; } } public class EmployeeDetailsOut { // main method for run the application //main method modifier must be public public static void Main(string[] args) { Employee emp = new Employee(); emp.setDetails(2424, "Paramesh", 400000.00); Console.WriteLine("Employee Details"); Console.WriteLine("Employee ID Number : " + emp.getEmpID()); Console.WriteLine("Employee Name : " + emp.getEmpName()); Console.WriteLine("Employee Salary : " + emp.getSalary()); Console.WriteLine("\n"); Employee emp1 = new Employee(); emp1.setDetails(2423, "Amardeep", 600000.00); Console.WriteLine("Employee Details"); Console.WriteLine("Employee ID Number : " + emp1.getEmpID()); Console.WriteLine("Employee Name : " + emp1.getEmpName()); Console.WriteLine("Employee Salary : " + emp1.getSalary()); } }
出力:
カスタム属性のデモ
コード:
using System; using System.Diagnostics; public class DemonstrationOfCustomAttribute { [Conditional("DEBUG")] public static void getMyOut(string msg) { Console.WriteLine(msg); } } public class Test { static void firstMethod() { DemonstrationOfCustomAttribute.getMyOut("I am first method."); secondMethod(); } static void secondMethod() { DemonstrationOfCustomAttribute.getMyOut("I am second method."); } public static void Main() { DemonstrationOfCustomAttribute.getMyOut("I am in main method."); firstMethod(); } }
出力:
C# のカスタム属性は、クラスで使用される宣言された実装を定義するために使用されます。このカスタム属性の実装は、AttributeUsageAttribute、AttributeUsage (AttributeTargets.All、Inherited = false、AttributeUsage (AttributeTargets.Method、AllowMultiple = true)) を使用する 3 つの手順で実現できます。
以上がC# カスタム属性の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。