[解決済み】.NETの属性とは何ですか?
質問
.NETにおける属性とは何ですか、何に使うのですか、また、独自の属性を作成するにはどうすればよいですか?
どのように解決するのですか?
メタデータ。オブジェクト/メソッド/プロパティに関するデータ。
例えば、次のようなAttributeを宣言します。これにより、UIに表示されるプロパティの順番を簡単に制御することができる。そして、この属性をクラスに追加し、属性を抽出してUI要素を適切に並べるGUIコンポーネントを書くことができる。
public class DisplayWrapper
{
private UnderlyingClass underlyingObject;
public DisplayWrapper(UnderlyingClass u)
{
underlyingObject = u;
}
[DisplayOrder(1)]
public int SomeInt
{
get
{
return underlyingObject .SomeInt;
}
}
[DisplayOrder(2)]
public DateTime SomeDate
{
get
{
return underlyingObject .SomeDate;
}
}
}
これにより、私のカスタムGUIコンポーネントで作業する場合、SomeIntが常にSomeDateの前に表示されることを保証します。
しかし、直接のコーディング環境以外では、最も一般的に使用されているのを見ることができます。例えば、Windowsデザイナーは、カスタムメイドのオブジェクトをどのように扱うかを知るために、これらを広範囲に使用します。BrowsableAttributeをこのように使用します。
[Browsable(false)]
public SomeCustomType DontShowThisInTheDesigner
{
get{/*do something*/}
}
例えば設計時にプロパティウィンドウで利用可能なプロパティにこれをリストアップしないようにデザイナーに指示します。
あなたは できる また、コード生成、プリコンパイル操作(Post-Sharpなど)、Reflection.Emitなどのランタイム操作に使用することもできます。 例えば,プロファイリングのために,コードが行うすべての呼び出しを透過的にラップして時間を計測するコードを少し書くことができます.特定のメソッドに配置する属性によって、タイミングをオプトアウトすることができます。
public void SomeProfilingMethod(MethodInfo targetMethod, object target, params object[] args)
{
bool time = true;
foreach (Attribute a in target.GetCustomAttributes())
{
if (a.GetType() is NoTimingAttribute)
{
time = false;
break;
}
}
if (time)
{
StopWatch stopWatch = new StopWatch();
stopWatch.Start();
targetMethod.Invoke(target, args);
stopWatch.Stop();
HandleTimingOutput(targetMethod, stopWatch.Duration);
}
else
{
targetMethod.Invoke(target, args);
}
}
宣言は簡単で、Attributeを継承したクラスを作成するだけです。
public class DisplayOrderAttribute : Attribute
{
private int order;
public DisplayOrderAttribute(int order)
{
this.order = order;
}
public int Order
{
get { return order; }
}
}
また、attributeを使用する際には、quot;attribute"というサフィックスを省略することができることを忘れないでください。
注意
属性はそれ自体では何もしません。属性を使用する他のコードが必要です。それを使う他のコードが必要なのです。そのコードはすでに書かれていることもあれば、自分で書かなければならないこともあります。例えば、C#コンパイラはあるものを気にしますし、あるフレームワークではあるものを使います(例えば、NUnitはアセンブリをロードするときにクラスの[TestFixture]とテストメソッドの[Test]を探します)。
したがって、独自のカスタム属性を作成する場合は、コードの動作にまったく影響を与えないことを認識しておいてください。属性をチェックする他の部分を(リフレクションを使って)書き、それに基づいて動作させる必要があるのだ。
関連
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] ディープクローンオブジェクト
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] C#の[Flags]Enum属性の意味とは?
-
[解決済み] .NET Coreと.NET Standard Class Libraryのプロジェクトタイプの違いは何ですか?
-
[解決済み] AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersionの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み] C#で、クラスや関数の前に角括弧で書かれているものは何でしょうか?重複] [重複] [重複] [重複
-
[解決済み] C#でカスタム属性を作成する方法