2011-12-11 34 views
17

Tôi có một C# chú thích đó là:Làm thế nào để bạn đặt một Func trong một thuộc tính C# (chú thích)?

[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; 
    } 
} 

Như bạn có thể thấy, có là một tài sản mà là một Func và tôi muốn gọi nó là tự động. Về cơ bản, tôi muốn phân tích tất cả các phương thức có chú thích này và sau đó gọi hàm Func được gắn vào chú thích.

Tôi muốn sử dụng nó như thế này (đây là một ví dụ đơn giản của một chức năng tiếng vang, mà được một chuỗi và trả về chuỗi giống nhau):

[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]) }; 
    } 

tôi đã không có lỗi trong tôi Lớp chú thích nhưng khi nói đến việc tạo lại toàn bộ giải pháp, mỗi khi tôi khai báo một phương thức với chú thích, tôi có một lỗi cho tôi biết rằng tôi phải sử dụng các chữ trong một chú thích.

Tôi hiểu rằng có những hạn chế, nhưng có cách nào để tôi có thể tránh được sự cố này không? Tôi biết tôi có thể sử dụng một chuỗi thay vì một Func, và tìm động cho chức năng có tên giống như chuỗi, nhưng tôi không muốn làm như vậy.

Cảm ơn bạn đã trợ giúp :)

+1

Nó có thể trông không đẹp, nhưng bạn thường sẽ tìm các chuỗi làm đối số cho thuộc tính vì các giá trị phải được biết tại thời gian biên dịch. – danludwig

Trả lời

7

Tôi không nghĩ điều đó là có thể, C# chỉ cho phép bạn sử dụng Thuộc tính với giá trị không đổi.

Một cách để làm điều này là tạo một lớp thay vì một func, và sau đó bạn chuyển loại của lớp đó vào thuộc tính. Sau đó, bạn sẽ cần phải khởi tạo nó với sự phản chiếu và thực hiện một phương thức trong đó.

Vì vậy, một ví dụ sẽ là:

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

sau đó thuộc tính của bạn sẽ mất một loại thay vì một Func

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

sau đó bạn sẽ tạo ra một lớp mà thực hiện giao diện của bạn và vượt qua nó vào thuộc tính. Mặc dù điều này có nghĩa là (ít nhất là ban đầu và không biết vấn đề của bạn), bạn sẽ cần phải tạo một lớp mới mỗi lần bạn muốn trả về các kết quả khác nhau.

6

Từ C# spec:

17.1.3 loại tham số thuộc tính

Các loại tham số vị trí và đặt tên cho một lớp thuộc tính được giới hạn cho các loại tham số thuộc tính, đó là:

· Một trong các loại sau: bool, byte, char, double, float, int, long, sbyte, short, string, uint, ulong, ushort.

· Đối tượng loại.

· Loại System.Type.

· Loại enum, miễn là có khả năng truy cập công cộng và các loại trong đó lồng nhau (nếu có) cũng có khả năng truy cập công cộng (§17.2).

· Mảng đơn chiều của các loại trên.

Các vấn đề liên quan