2010-12-02 20 views
1

レッツを使用する別の方法は、私は次しまったと言う:のC# - 属性

public class A { 
    [MyAttribute] 
    public void Test() {} 
} 

私は[]とメソッドやクラスを先頭に付加する属性を追加するの振る舞いを好きではありません。私は、コードを読みにくくすると思います。

私はより良いアプローチのようなものであることができることを見つける:

AddAttribute(A, Test, MyAttribute); 

そのような何かを行う方法はありますか?

それは、実行時に属性を追加することのいくつかの種類であるので...

または属性を使用するための他の方法は何ですか? XMLファイルと同じですか?

+4

私は読みやすさの引数に同意する必要があります。あなたのAdd()ステートメントは、遠く離れていて簡単に見逃してしまうかもしれません。 –

+1

たとえば、クラスhttp://weblogs.aspを見てみましょう。net/blogs/scottgu/image_46680F68.png。私は本当に読みにくいコードを見つける。もっとクリーンな方法が必要です。 FluentValidationのようなもの。しかし、何かが組み込まれています。それらの属性をエミュレートするものはありません... – Melursus

+0

そのクラスはかなり読みやすいようです。正直なところ、属性をメソッド呼び出しのように見えるように置き換えると、読みやすくなりますか?メソッド呼び出しのように見えるものを入れても、メソッド呼び出しのように見えませんか? –

答えて

5

アトリビュートは実行時に追加できません。アトリビュートはアセンブリのメタデータに埋め込まれています。ただし、コンパイルする前にソースコードを変更するビルド中に外部ツールを使用して属性を追加することはできます。

1

いいえ、属性を置き換えるための一般的な解決策はありません。

ただし、属性によって提供されるものを実装する他の方法があります。それは実際にあなたが使用しているフレームワークに依存します。

0

状況によって異なります。 いくつかのシナリオの場合、実際にはとなりますが、TypeDescriptor(これはほとんどのUIデータバインディングが使用しているものです)とではなく、生反映です。例えば、タイプに注釈を付けるための

TypeDescriptor.AddAttributes(typeof(Foo), 
    new TypeConverterAttribute(typeof(ExpandableObjectConverter))); 

ランタイムでタイプための型コンバータを交換します。

のプロパティでトリックを行うこともできますが、それはロットモードです...フィディー

一般的なケースについては、コード属性を使用するだけです。そこ属性に関する本質的に読めないものは何もありませんし、その場所は、彼らがメタデータあることhighlighになって - 本当にタイプ/方法自体の一部程度タイプ/方法ではなく。


以下は説明のためのものです。あなたはそれを見て好きではないという理由だけで(私は注釈マシンによって生成されたコードを助けるためにこのような何かを行っているが)私はこれをしないだろう。

ファイルを1

[Description("evil evil evil")] 
partial class Foo { 
    [Description("don't do this")] 
    partial void Bar(); 
} 

ファイル2

partial class Foo { 
    partial void Bar() { 
     Console.WriteLine("I can only be called from inside the type; " 
      + "I can't be public"); 
    } 
}