2017-04-21 32 views
1

私は、次のC#コードに出くわした:クラスは言葉Attributeを前置しなければならないと言う私たちはSonarLintを使用し、1 of it's rules属性クラス名に「属性」を追加していますか?

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)] 
public class Marker : Attribute 
{ 
} 

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)] 
public class MarkerAttribute : Attribute 
{ 
} 

私はMarkerAttributeに破壊変更を名前Markerを変更している不思議でしたか?属性を使用する場合は、Attributeの部分をスキップすることが許可されているためです。一方、コード内で属性を使用する場合は、名前を変更するよりも名前全体が必要になります。

これが大きな変更と見なされる場合、これに対処する最も良い方法は何ですか?使用時に

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)] 
public class MarkerAttribute : Attribute { } 
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)] 
public class Marker : MarkerAttribute { } 

は、以下のコンパイルエラーになります:このため

CS1614「マーカー」が「マーカー」と「MarkerAttribute」の間の曖昧です。 '@ Marker'または 'MarkerAttribute'のいずれかを使用します。

+0

APIの観点から言うと、もちろん、すべてのクラスの名前を変更するように変更されています。したがって、すべての依存するアセンブリも再コンパイルする必要があります。 – HimBromBeere

答えて

2

属性はメタデータです。それ自身の属性では何もしません。属性は、あるコードがそれらを読むときに有用になります。属性値を読み取るには、コードで属性クラス名を使用する必要があります。例えば。 GetCustomAttribute<T>を呼び出します。

Maker maker = yourType.GetCustomAttribute<Maker>(); 

したがって、属性クラスの名前を変更することは大きな変更です。コンプライアンスチェックルールを渡すには、属性クラスの名前を変更する必要があります。オプションはありません。あなたがここに継承だろうと、その


注:

public class Marker : MarkerAttribute { } 

は、あなたが壊れまったく同じSonarLintルールになってしまいます - あなたは非準拠となります一つは2つの属性クラスを取得します。

関連する問題