.NETのコアCSHARP中間の記事2-8
このセクションでは、機能のタグが含まれています
簡単な紹介
属性ラベルを使用すると、属性はあなたのコードを合理化するために最適化技術を使用することができ、非常に重要な技術です。特徴タグは、アセンブリで使用することができ、モジュール、型(クラス、構造体、列挙型、インターフェイス、デリゲート)(コンフィギュレーションを含む)、フィールド、メソッド、メソッド、パラメータ、メソッドの戻り値、属性(プロパティ)内の属性。その使用量は柔軟性があり、我々は、ラベルの使用上の簡単なプレゼンテーションを行います。
機能タグ属性
指定された特性を属性
次のような特徴括弧の対タグ、マーカータグが必要な部分、
[Table("People")]
class People
{
}
これは、ラベルがクラスを入力しますプロパティ、メソッドのいずれかを処理するためにタグ付けされました。そして、あなたのタグブラケットは、実際には、そのコンストラクタを呼び出しています。
フィーチャータグは、当社の事前に定義されたマクロに似ていますが、それは、より限定された一部の使用コードまたは説明の拡張のためにマークされています。
事前定義された属性は、属性
.NET Frameworkは、3つの定義済みの特性を提供します。
- AttributeUsage
- 条件付きの
廃れました
AttributeUsage
カスタム属性を実装する必要がある場合は、ここで、三つのパラメータを渡すことができAttributeUsageこれは、クラスを作成し、Attributeクラスを継承する必要がある、とあなたはあなたの属性AttributeUsageラベルの制限を使用する必要があります。- 所定の特性パラメータvalidon言語要素が配置されてもよいです。これは、列挙子AttributeTargetsの値の組み合わせです。デフォルト値はAttributeTargets.Allです。
- (オプション)AllowMultipleパラメータは、ブール属性AllowMultiple特性(プロパティ)のために用意されています。trueの場合、この機能は、マルチ使用です。デフォルト値はfalse(シングルユース)です。同じプロパティ、クラス、関数、などの中で複数回使用されるラベル
継承されたパラメータ(オプション)は、特性(プロパティ)を継承した属性のためのブール値を提供します。trueの場合、この機能は、派生クラスによって継承することができます。デフォルト値はfalseです(継承されません)。
廃れました
エンティティタグ付けされた定義済みの特性は、プログラムで使用すべきではありません。それはあなたが特定のターゲット要素を破棄するようにコンパイラに指示することができます。たとえば、新しいメソッドをクラスで使用していますが、まだクラスの古いメソッドを維持したい場合は、あなたは(メッセージの古い方法は、それが時代遅れとしてマークするのではなく、新しい方法を使用する必要があります時代遅れを表示することができますA)。
- 廃止されたが、コンストラクタに二つのパラメータ、ここで持っている
プロジェクト時代遅れとどのような代替使用説明なぜパラメータメッセージを、文字列です。 - パラメータISERRORは、ブール値です。trueの場合、コンパイラは間違いとしてプロジェクトを使用する必要があります。デフォルト値は(コンパイラが警告を生成します)falseです。
例えば
using System;
public class MyClass
{
[Obsolete("Don't use OldMethod, use NewMethod instead", true)]
static void OldMethod()
{
Console.WriteLine("It is the old method");
}
static void NewMethod()
{
Console.WriteLine("It is the new method");
}
public static void Main()
{
OldMethod();
}
}
プロパティISERROR真であるので、上記の手順は、コンパイル時にスローされます指定されているように、エラーメッセージは、私たちがメッセージを指定しています。
あなたはISERRORがfalseを指定した場合は、上記のコードはコンパイルして実行するが、警告アラームがあるでしょう。
条件付きの
事前定義された特性は、その実行を事前に指定された識別子に依存する条件付きメソッドを、マークされました。
それは、このようなデバッグやトレースなどの指定された値に応じて、メソッド呼び出しの条件付きコンパイルの原因となります。例えば、デバッグコードの可変表示の値。
この機能の規定の構文は次のとおりです。
[Conditional(
conditionalSymbol
)]
//例如:
[Conditional("DEBUG")]
それは注意する必要があります。
- 条件は、方法や構造体宣言で宣言されなければなりません。条件付き属性は、インタフェース宣言メソッドで指定されている場合は、コンパイル時にエラーが発生します。
- この方法は、戻り値の型の条件を持っている必要があります。
- フラグ条件は変更用メソッドをオーバーライドすることはできません。しかし、仮想フラグ条件改質剤を用いる方法。このような方法オーバーライドされたメソッドは、暗黙の条件付きの方法ですが、明示的に条件付き属性でマークされていません。
- 条件は、メソッドインターフェイスメソッドを実装することはできません。そうでなければ、コンパイル時エラーが発生します。
- プロセスの条件は、「デリゲート作成式」で使用する場合は、コンパイルエラーが発生します
カスタム属性を作成します
私たちの基本的な内容のいくつかを終え、我々は我々のアプリケーションのいくつかを説明し、わずかな反射があるでしょう私たちの次の講義に来るが、非常に深くありません。
TestAttributeを構築
// 描述如何使用一个自定义特性
[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]
//自定义特性
public class TestAttribute : Attribute {
private string name; // 名字
private string date; // 日期
public string Name {
get { return name; }
set { name = value; }
}
public string Date {
get { return date; }
set { date = value; }
}
public TestAttribute(string name) {
this.name = name;
this.name = name;
}
}
インスタンス化
[Test("Amy", Date = "2018-06-18")]
[Test("Jack", Date = "2018-06-18")]
class Test{}
タグ内のタグ値を抽出します
Type t = typeof(Test);
var value = t.GetCustomAttributes(typeof(TestAttribute),true);
foreach(TestAttribute each in value)
{
Console.WriteLine("Name:{0}", each.Name);
Console.WriteLine("Data:{0}",each.Data);
}
私の記事はあなたを助ける場合は、お使いのgithubの.NETCoreGuideプロジェクトは私にスター、庭の中間点のブログでの懸念と勧告を助けていてください。