2011-12-11 7 views
17

私はC#の注釈がありますどのようにしてFuncをC#属性(アノテーション)に入れますか?

[AttributeUsage(AttributeTargets.Method)] 
public class OperationInfo : System.Attribute { 
    public enum VisibilityType { 
     GLOBAL, 
     LOCAL, 
     PRIVATE 
    } 
    public VisibilityType Visibility { get; set; } 
    public string Title { get; set; } 
    public Func<List<string>, List<string>> Func; 

    public OperationInfo(VisibilityType visibility, string title, Func<List<string>, List<string>> function) { 
     Visibility = visibility; 
     Title = title; 
     Func = function; 
    } 
} 

あなたが見ることができるように、のFuncであると私はそれを動的に呼び出したいプロパティがあります。基本的には、このアノテーションを持つすべてのメソッドを解析し、アノテーションにバインドされたFuncを呼びたいと思います。

私は、この(これは文字列を取得し、同じ文字列を返すエコー機能の簡単な例である)のようにそれを使用したい:私は私の中ではエラーを得なかっまし

[OperationInfo(OperationInfo.VisibilityType.GLOBAL, "echo", IDoEcho)] 
    public static string DoEcho(string a) 
    { 
     return a; 
    } 

    [OperationInfo(OperationInfo.VisibilityType.PRIVATE, null, null)] 
    public static List<string> IDoEcho(List<string> param) { 
     return new List<string>() { DoEcho(param[0]) }; 
    } 

アノテーションクラスですが、ソリューション全体を再生成する場合、アノテーションを使用してメソッドを宣言するたびに、アノテーションでリテラルを使用する必要があることを示すエラーが表示されます。

制限があることを理解していますが、この問題を回避できる方法はありますか?私はFuncの代わりに文字列を使うことができ、文字列と同じ名前の関数を動的に見ているが、そうしたくないと思う。助けるため

感謝:)

+1

コンパイル時に値を知っていなければならないので、属性の引数として文字列が見つかることがよくあります。 – danludwig

答えて

7

が、私はそれが可能だとは思わないが、C#のは、あなたが唯一の一定の値を持つ属性を使用することができます。

これを行う1つの方法は、funcではなくクラスを作成し、そのクラスの型を属性に渡すことです。 これをリフレクションでインスタンス化し、そこにメソッドを実行する必要があります。

ですから、例えば次のようになります。

public interface IDoStuff 
{ 
    IList<string> Execute(); 
} 

、あなたの属性は、あなたが、あなたのインターフェイスを実装するクラスを作成し、にそれを渡す代わりのFunc

public OperationInfo(VisibilityType v, string title, Type type) 
{ 
    ///... 
} 

のタイプを取ります属性。これは、(少なくとも最初は問題を知らずに)異なる結果を返すたびに新しいクラスを作成する必要があることを意味しますが、 C#の仕様から

6

17.1.3属性パラメータの種類

属性クラスのための位置と名前付きパラメータの種類がある属性パラメータの種類に限定されている:

・bool、byte、char、double、float、int、long、sbyte、short、string、uint、ulong、ushortのいずれかです。

・タイプオブジェクト。

・タイプSystem.Type。

・パブリック・アクセシビリティとそれが入れ子になっている型(もしあれば)がパブリック・アクセシビリティ(17.2)も持つならば、enum型。

・上記のタイプの1次元配列。

関連する問題