2011-12-11 66 views
17

我有一個C#的註釋是:如何在C#屬性(註釋)中放置Func?

[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#只允許使用具有唯一不變的值的屬性。

這樣做的一種方法是創建一個類而不是func,然後將該類的類型傳遞給該屬性。 然後你需要用反射來實例化它並在其中執行一個方法。

因此,一個例子是:

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

那麼你的屬性會採取一個類型,而不是一個函數功能的

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

那麼你會創建一個實現你的接口的類,並把它傳遞到屬性。雖然這意味着(至少在開始時,並且不知道您的問題),但每次您要返回不同的結果時都需要創建一個新類。

6

從C#規格:

17.1.3屬性參數類型

的類型屬性類的位置和命名參數的僅限於該屬性的參數類型,它們是:

·以下類型之一:bool,byte,char,double,float,int,long,sbyte,short,string,uint,ulong,ushort。

·類型對象。

·System.Type類型。

·一個枚舉類型,只要它具有公共可訪問性並且它嵌套的類型(如果有的話)也具有公共可訪問性(第17.2節)。

·上述類型的一維數組。