はい、独自の属性を作成できますAttribute。つまり、から継承するだけです。
public class FooAttribute : Attribute {
public int Bar {get;set;}
}
次に、それを添付できます:
[Foo(Bar=12)]
public int X {get;set;}
(AttributeUsageAttribute適用できるものを制限したい場合も参照してください-たとえば、クラス、フィールド、インターフェースなど)
一部の属性 ( ConditionalAttribute、ObsoleteAttributeなど) はコンパイラにとって意味がありますが、PostSharp などのサードパーティ ツールを使用する場合を除き、属性を使用して独自のコンパイル時機能を作成することはできません。できることは、実行時にリフレクション (特にAttribute.GetCustomAttribute[s]) を介して属性をチェックし、それに応じてコードで反応することです。ほとんどの属性は、リフレクションによってこのように使用されます。
foreach(var prop in type.GetProperties()) {
var foo = (FooAttribute)Attribute.GetCustomAttribute(
prop, typeof(FooAttribute));
if(foo != null) {
Console.WriteLine("{0} has Foo.Bar: {1}", prop.Name, foo.Bar);
}
}
.NET のすべてのバージョンで属性がサポートされていますが、一部の限定されたフレームワークでは、BCL 属性の一部が必要でない場合でも欠落していることがあります。たとえば、DataContractAttribute経由で WCF をサポートしていないプラットフォームには存在しませんDataContractSerializer。