ホームページ  >  記事  >  バックエンド開発  >  C# カスタム属性

C# カスタム属性

王林
王林オリジナル
2024-09-03 15:07:19986ブラウズ

カスタム属性とは何かを説明する一方で、属性について理解する必要があります。属性は、実行時に C# プログラム内の要素に関する追加情報を C# コンパイラに提供するメタデータ拡張です。これらの属性は、条件を設定したり、コードの読みやすさと効率を向上させるために使用されます。 C# (C シャープ) には非常に多くの定義済み属性が存在し、「カスタム属性」と呼ばれる新しいユーザー属性を作成する機能もあります。カスタム クラスを作成するには、システムからクラスを構築する必要があります。属性クラス。

カスタム属性は C# でどのように機能しますか?

C# カスタム属性は、構築に使用される事前定義されたクラスに基づいて機能します。カスタム属性を作成する方法を段階的に見ていきます。カスタム属性を作成する手順:

ステップ #1

AttributeUsageAttribute タグを使用する場合: 属性の構築に AttributeUsageAttribute タグが使用されます。このタグは、ターゲット属性が何か、これを継承できるかどうか、または属性の複数のオブジェクトまたはインスタンスが存在できるかどうかにも使用されます。この AttributeUsageAttribute タグには 3 つの主要メンバーがあります

  • AttributeUsageAttribute( AttributeTargets.All)
  • AttributeUsage(AttributeTargets.All, Inherited = false)
  • AttributeUsage(AttributeTargets.Method、AllowMultiple = true)

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)

ステップ #2

1.属性クラスを定義することによって: これは通常のクラス定義とほぼ同じです。クラス名は従来の Attribute で終わります。この属性クラスは System.から継承されます。属性クラス。

構文:

[AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = false)]
public class MyAttributeDefinition: Attribute
{
//some logic or methods
}

ステップ #3

1.プロパティとコンストラクターの定義: デフォルト値を設定するための他のすべてのクラス コンストラクターと同様のコンストラクターの定義とプロパティは、データベース接続名情報、静的情報などの定義に使用されます。

構文 #1

public MyAttribute(dataType dataTypeValue)
{
this.dataTypeValue= dataTypeValue;
}
注: カスタム属性には、データ型変数を取得および設定するためのプロパティがあります。

構文 #2

public dataType Properties
{
get {return this.dataTypeValue;}
set {this.value = presentValue;}
}

C# カスタム属性を実装する例

以下に挙げる例を示します:

例 #1

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

出力:

C# カスタム属性

例 #2

従業員の詳細を含むカスタム属性

コード:

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

出力:

C# カスタム属性

例 #3

カスタム属性のデモ

コード:

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# カスタム属性

結論

C# のカスタム属性は、クラスで使用される宣言された実装を定義するために使用されます。このカスタム属性の実装は、AttributeUsageAttribute、AttributeUsage (AttributeTargets.All、Inherited = false、AttributeUsage (AttributeTargets.Method、AllowMultiple = true)) を使用する 3 つの手順で実現できます。

以上がC# カスタム属性の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。